【问题标题】:redirect_to using PATCH verb not GETredirect_to 使用 PATCH 动词而不是 GET
【发布时间】:2014-04-10 21:40:45
【问题描述】:

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

在主页上,我有一个可以启用/禁用的项目列表,很简单。这一切都由两个链接之一处理<%= 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 调用以某种方式使用 PATCH 动词而不是导致路由问题的 GET。以下是我的通话记录输出

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 (No route matches [PATCH] "/"): 是问题

我不确定解决这个问题的方法。我不想使用 PATCH 动词,但我似乎找不到在 redirect_to 中指定动词的方法

有什么想法吗?

【问题讨论】:

  • 您不能在ajax 调用中从服务器端(控制器)重定向。通过 javascript 检索到的所有内容都返回到 javacript。因此,您需要使用 javascript 执行该重定向。

标签: ruby-on-rails ajax ruby-on-rails-4 actioncontroller


【解决方案1】:

您不能在 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

【讨论】:

  • 这是有道理的。谢谢。我会试一试,然后告诉你。
  • 又一个更新。我似乎无法弄清楚如何让闪存持续到会话控制器。我确定这应该是另一个问题,但想记录我的结果。重定向虽然有效,但这是主要挑战。谢谢!
  • 我发现了 flash 问题,只是在 url 中添加了一个搜索参数并在重定向控制器中检查它。 redirect_url = (log_in_url.to_s + "?logged_out") & 然后是 render js: "window.location = #{redirect_url.to_json}" Hacky 我知道,但会一直工作直到我找到“正确的方法”来工作
猜你喜欢
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 2015-05-03
  • 2013-04-24
  • 2019-07-21
相关资源
最近更新 更多