2012-01-13 99 views
1

我试过寻找其他答案,但我似乎无法弄清楚为什么我的重定向不起作用。Rails redirect_to无法正常工作?

所以我使用Devise with Rails 3.1,并且我正在购物网站。访客不允许将东西添加到他们的购物车中,除非他们已登录。这是我遇到的问题:如果他们没有登录,我想将它们重定向到项目索引页面。下面是我有:

class ItemsController < ApplicationController 
    def add_to_cart 
    @item = Item.find(params[:id]) 
    if current_user 
     @item.update_attributes(:cart_id => @current_cart.id) 
     redirect_to :back 
    else 
     redirect_to categories_path, notice: 'You must sign in to add an item to your cart.' 
    end 
    end 
. 
. 
. 
end 

至于现在,当我点击的链接添加到购物车,该方法被执行(我可以看到在服务器日志Rails的加载和定义@item),并且它达到'else'语句,但不会发生重定向。

我已经为index,new等生成了脚手架(所有的REST风格的动作)。另外,我确定我正在使用add_to_cart方法,因为我试着用一些puts语句进行调试。这里发生了什么事?

编辑:

此外,另一个可能是使用的奇怪的事情...服务器似乎试图两次执行这种方法,并试图“得到”类别两次:

Started GET "/items/3/add_to_cart" for 127.0.0.1 at 2012-01-12 16:53:11 -0800 Processing by ItemsController#add_to_cart as JS Parameters: {"id"=>"3"} Category Load (0.3ms) SELECT "categories".* FROM "categories" Item Load (0.2ms) SELECT "items".* FROM "items" WHERE "items"."id" = $1 LIMIT 1 [["id", "3"]] Redirected to http://localhost:3000/categories Completed 302 Found in 26ms

Started GET "/items/3/add_to_cart" for 127.0.0.1 at 2012-01-12 16:53:11 -0800 Processing by ItemsController#add_to_cart as JS Parameters: {"id"=>"3"} Category Load (0.2ms) SELECT "categories".* FROM "categories" Item Load (0.2ms) SELECT "items".* FROM "items" WHERE "items"."id" = $1 LIMIT 1 [["id", "3"]] Redirected to http://localhost:3000/categories Completed 302 Found in 25ms

Started GET "/categories" for 127.0.0.1 at 2012-01-12 16:53:12 -0800 Processing by CategoriesController#index as JS Category Load (0.2ms) SELECT "categories".* FROM "categories" CACHE (0.0ms) SELECT "categories".* FROM "categories" Rendered categories/index.html.erb within layouts/application (0.0ms) Completed 200 OK in 35ms (Views: 28.5ms | ActiveRecord: 4.2ms)

Started GET "/categories" for 127.0.0.1 at 2012-01-12 16:53:12 -0800 Processing by CategoriesController#index as JS Category Load (0.2ms) SELECT "categories".* FROM "categories" CACHE (0.0ms) SELECT "categories".* FROM "categories" Rendered categories/index.html.erb within layouts/application (0.0ms) Completed 200 OK in 37ms (Views: 30.6ms | ActiveRecord: 4.2ms)

EDIT 2(Delba的要求)

resources :items do 
    member do 
    get 'add_to_cart' 
    end 
end 

编辑3:改变else语句的JavaScript

respond_to do |format| 
    format.js { redirect_to items_path, notice: 'You must sign in to add an item to your cart.' } 
    end 
+0

您是否使用了AJAX的形式? ('remote:true') – Damien 2012-01-13 00:54:18

+0

@Delba是的。这里是我添加到购物车的链接:%= link_to'添加到购物车',{:controller =>“items”,:action =>“add_to_cart”,:id => item.id}, \t:remote => true %> – varatis 2012-01-13 00:58:57

+0

你不应该使用GET来添加'add_to_cart'。使用POST。请张贴您的路线。 – Damien 2012-01-13 00:59:46

回答

3

回应任何人谁可能需要答案对于这个问题,只需将redirect_to语句替换为以下内容:

respond_to do |format| 
    format.js 
    end 

然后,在您的项目下的视图中,创建一个add_to_cart.js.erb页面,其中包含javascript以进行通知,或执行任何操作。下面是我把我的:

alert("Need to be signed in") 

编辑:另外,对于它执行两次部分:这是有点风马牛不相及,但由于某种原因在默认情况下Rails包含重复的Javascript。具体来说,看看application.js:它说需要jquery并且需要jquery_ujs。禁用其中的一个,你可以免费回家。

要禁用这些Java脚本之一:

转到资产/ application.js中

删除注释(//)之前需要的jQuery,需要树。

这样,Rails不承担默认的,而是只包括jQuery和你的资产/ JavaScript的任何其他的JavaScript