2014-04-10 26 views
0

我正在将我的一些rails 4应用程序中的一些请求迁移到ajax,并且在重定向时遇到了一些麻烦。redirect_to使用PATCH谓词不GET

在主页上,我有一个可以启用/禁用的项目列表,非常简单。这是所有照顾两个中的一个环节<%= link_to "disable", toggle_my_class_path(my_class), method: "PATCH", remote: true %>

ApplicationController我有一个before_action来检查,如果当前用户登录,如果不是他们重定向到显示在日志中形式的主页。

def require_login 
    unless current_user 
    redirect_to root_url, :notice => "Please log in" 
    end 
end 

的问题是,(我认为),因为Ajax调用不知何故被用于代替GET这是造成路由问题PATCH动词。下面是从我的呼叫日志输出

Started PATCH "/my_class/2/toggle" for 127.0.0.1 at 2014-04-10 16:33:52 -0500 
Processing by MyClassController#toggle as JS 
    Parameters: {"id"=>"2"} 
Can't verify CSRF token authenticity 
    (0.1ms) SELECT COUNT(*) FROM "users" 
Redirected to http://localhost:3000/ 
Filter chain halted as :require_login rendered or redirected 
Completed 302 Found in 9ms (ActiveRecord: 1.3ms) 


Started PATCH "/" for 127.0.0.1 at 2014-04-10 16:33:56 -0500 

ActionController::RoutingError (No route matches [PATCH] "/"): 
    actionpack (4.0.0) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call' 
    actionpack (4.0.0) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call' 
    railties (4.0.0) lib/rails/rack/logger.rb:38:in `call_app' 
    railties (4.0.0) lib/rails/rack/logger.rb:21:in `block in call' 
    activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `block in tagged' 
    activesupport (4.0.0) lib/active_support/tagged_logging.rb:25:in `tagged' 
    activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `tagged' 
    railties (4.0.0) lib/rails/rack/logger.rb:21:in `call' 
    actionpack (4.0.0) lib/action_dispatch/middleware/request_id.rb:21:in `call' 
    rack (1.5.2) lib/rack/methodoverride.rb:21:in `call' 
    rack (1.5.2) lib/rack/runtime.rb:17:in `call' 
    activesupport (4.0.0) lib/active_support/cache/strategy/local_cache.rb:83:in `call' 
    rack (1.5.2) lib/rack/lock.rb:17:in `call' 
    actionpack (4.0.0) lib/action_dispatch/middleware/static.rb:64:in `call' 
    railties (4.0.0) lib/rails/engine.rb:511:in `call' 
    railties (4.0.0) lib/rails/application.rb:97:in `call' 
    rack (1.5.2) lib/rack/lock.rb:17:in `call' 
    rack (1.5.2) lib/rack/content_length.rb:14:in `call' 
    rack (1.5.2) lib/rack/handler/webrick.rb:60:in `service' 
    /home/***/.rvm/rubies/ruby-head/lib/ruby/2.1.0/webrick/httpserver.rb:138:in `service' 
    /home/***/.rvm/rubies/ruby-head/lib/ruby/2.1.0/webrick/httpserver.rb:94:in `run' 
    /home/***/.rvm/rubies/ruby-head/lib/ruby/2.1.0/webrick/server.rb:295:in `block in start_thread' 

你可以看到,的ActionController :: RoutingError(无路由匹配[PATCH]“/”):是问题

我不知道的一种解决方法。我不想PATCH动词被使用,但我似乎无法找到一种方法来指定动词redirect_to

有什么想法?

+2

不能从服务器端(控制器)的'ajax'呼叫重定向内。一切通过javascript检索返回到javacript。所以你需要使用javascript来执行重定向。 – markets

回答

2

您不能在ajax调用中从服务器端(控制器)重定向。一切通过javascript检索返回到javacript;网络浏览器期待一些javascript被评估。

所以你需要执行使用JavaScript的重定向。

例如,您可以更改before_action(代码未测试):

def require_login 
    unless current_user 
    if request.xhr? 
     flash[:notice] = "Please log in" 
     flash.keep(:notice) # Keep flash notice for the redirect 
     render js: "window.location = #{root_url.to_json}" # js to be evaluated 
    else 
     redirect_to root_url, :notice => "Please log in" 
    end 
    end 
end 
+0

这很有道理。谢谢。我会试一试,让你知道。 – Patrick

+0

试过了,效果很棒!再次感谢 – Patrick

+0

再一次更新。我似乎无法弄清楚如何让闪存坚持会话控制器。我相信这应该是另一个问题,但想记录我的结果。重定向工作虽然,这是主要的挑战。谢谢! – Patrick