0

我一直在尝试为用户身份验证开发控制器操作,因此我可以执行以下操作:

class PostsController < ApplicationController
  before_filter :authenticate_user!
...

并具有在用户通过身份验证后重定向回上一页的身份验证操作。我知道有存储和重定向方法来解决这个问题。但是,这不适用于需要非 GET 操作的任何操作,即删除帖子。

我找到了Rails 2 的解决方案,其中涉及使用该controller.process方法从另一个控制器调用 POST 操作。不过,这在 Rails 3 中已被弃用。Rails 3中有一些等效的方法吗?我一开始就找不到关于旧controller.process命令的太多文档。

如果有人对另一种方法有建议,那也将不胜感激。

4

2 回答 2

2

我在 Rails 3 中遇到了同样的问题,不推荐使用 controller.process。下面是我尝试使用 Rack::MethodOverride 代替 controller.process (在 Rails 2 中为我工作)的失败尝试。下面来自 ro.call 的错误是:

User sessionsController#create thread 0xb592b994 中的 ThreadError 试图加入自身

演示

params = {'action' => 'create', 'controller' => 'user_sessions', 
        "commit"=>"Submit", "user_session"=>{"username"=>"demo", "password"=>"demo"}}

request.env['REQUEST_METHOD'] = 'POST'

# Throw out existing params and merge the stored ones
request.parameters.reject! { true }
request.parameters.merge!(params)

request.path_parameters.reject! { true }
request.path_parameters.merge!('action' => 'create', 'controller' => 'user_sessions')

request.POST["HTTP_X_HTTP_METHOD_OVERRIDE"] = 'POST'
ro = Rack::MethodOverride.new Rails.application
ro.call request.env
if response.redirected_to
  @performed_redirect = true
else
  @performed_render = true
end

结尾

可能有人知道如何正确使用 Rack::MethodOverride 发送发布请求吗?

于 2011-05-19T14:58:26.617 回答
1

您可以将该方法与会话中重定向用户的 url 一起存储,然后再伪造它。不过,您必须在 Rack 中间件级别上执行此操作。例如,检查 lib/rack/methodoverride.rb 中的 Rack::MethodOverride。

于 2011-05-02T22:32:39.147 回答