31

我知道我可以用来request.referrer在 Rails 中获取完整的引用 URL,但是有没有办法从 URL 中获取控制器名称?

我想看看http://myurl.com/profiles/2的 URL 是否包含“profiles”

我知道我可以使用正则表达式来做到这一点,但我想知道是否有更好的方法。

4

3 回答 3

105

请记住,request.referrer它会在当前请求之前为您提供请求的 url。也就是说,您可以通过以下方式转换request.referrer为控制器/操作信息:

Rails.application.routes.recognize_path(request.referrer)

它应该给你类似的东西

{:subdomain => "", :controller => "x", :action => "y"}
于 2013-02-03T10:15:04.847 回答
4

这是我在 Rails 3 和 4 上的尝试。此代码在注销时提取一个参数并将用户重定向到自定义登录页面,否则它会重定向到一般登录页面。您可以通过这种方式轻松提取:controller。控制器部分:

def logout
  auth_logout_user
  path = login_path
  begin
    refroute = Rails.application.routes.recognize_path(request.referer)
    path = subscriber_path(refroute[:sub_id]) if refroute && refroute[:sub_id]
  rescue ActionController::RoutingError
    #ignore
  end
  redirect_to path
end

测试也很重要:

test "logout to subscriber entry page" do
  session[:uid] = users(:user1).id
  @request.env['HTTP_REFERER'] = "http://host/s/client1/p/xyzabc"
  get :logout
  assert_redirected_to subscriber_path('client1')
end

test "logout other referer" do
  session[:uid] = users(:user1).id
  @request.env['HTTP_REFERER'] = "http://anyhost/path/other"
  get :logout
  assert_redirected_to login_path
end

test "logout with bad referer" do
  session[:uid] = users(:user1).id
  @request.env['HTTP_REFERER'] = "badhost/path/other"
  get :logout
  assert_redirected_to login_path
end
于 2013-10-09T20:03:33.273 回答
-8

在控制器内部,您拥有controller_name只返回名称的方法。在您的情况下,它将返回“配置文件”。您也可以使用params[:controller]which 返回相同的字符串。

于 2013-02-02T15:21:35.527 回答