从Rails中的request.referer获取控制器名称

时间:2013-02-02 15:18:48

标签: ruby-on-rails-3

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

我想查看http://myurl.com/profiles/2的网址是否包含“个人资料”

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

3 个答案:

答案 0 :(得分:93)

请注意,request.referrer会在当前请求之前为您提供请求的网址。也就是说,以下是将request.referrer转换为控制器/动作信息的方法:

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

它应该给你类似的东西

{:controller => "x", :action => "y"}

答案 1 :(得分: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

答案 2 :(得分:-4)

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