如何在Rails 3中获取请求的目标控制器和操作?

46

在应用程序控制器的 before 过滤器中。

class ApplicationController < ActionController::Base
  before_filter :authenticate

  def authenticate
    # How do we know which controller and action was targetted?
  end
end

https://dev59.com/tHI95IYBdhLWcg3www2Y - manish nautiyal
4个回答

87
class ApplicationController < ActionController::Base
  before_filter :authenticate

  def authenticate
    # How do we know which controller and action was targetted?
    params[:controller]
    params[:action]
    # OR
    controller.controller_name
    controller.action_name    
  end
end

1
我已经准备好了一份文件,里面有大量标准问题的答案 :) - fl00r
我们过去一直很好地使用params[:action]。但是由于某种原因,在过去的一个月左右,它停止工作了。现在它变成了一个空哈希。然而,controller.action_name仍然可以工作。我们使用的是Rails 3.2。不确定为什么它停止工作,但我建议使用controller.action_name,因为它似乎更可靠。 - Joshua Pinter

16
在Rails 3.2中,您不再需要显式地调用controller.action_name,而只需使用"action_name"即可。
before_filter :check_if_locked


def check_if_locked
  puts action_name
  puts controller_name
end

我更喜欢这种方式,因为它会去掉路径前缀,只给出控制器名称,而不是使用params引用。 - Daniel Nalbach

13

您可以使用以下方法获取完整的URL对象:

url = Rails.application.routes.recognize_path(request.env['PATH_INFO'])

现在,您可以获取以下组件:

url[:controller]

url[:action]

在请求/响应生命周期中,默认情况下还可以分别使用params[:controller]params[:action]


在请求/响应周期之外很方便,但在其中绝对不必要。 - Swanand
这段代码非常方便,可以解析存储在某个字符串变量中的URL。 - Nazar Hussain
修改了答案,以便在请求/响应周期内使用。 - Nazar Hussain
1
这仅适用于HTTP GET方法的请求。要支持所有方法,请使用 url = Rails.application.routes.recognize_path(request.env['PATH_INFO'], { :method => request.env['REQUEST_METHOD'] }) - Chuck Batson

5
request.parameters['controller']
request.parameters['action']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接