Подтвердить что ты не робот

Получение имени контроллера из request.referer в Rails

Я знаю, что могу использовать request.referrer для получения полного URL-адреса реферера в Rails, но есть ли способ просто получить имя контроллера из URL-адреса?

Я хочу посмотреть, содержит ли URL-адрес http://myurl.com/profiles/2 "профили"

Я знаю, что могу использовать регулярные выражения для этого, но мне было интересно, есть ли лучший способ.

4b9b3361

Ответ 1

Внутри контроллера у вас есть метод controller_name, который возвращает вам только имя. В вашем случае он будет возвращать "профили". Вы также можете использовать params[:controller], который возвращает ту же строку.

Ответ 2

Имейте в виду, что request.referrer дает URL-адрес запроса перед текущим. Тем не менее, вот как вы можете преобразовать request.referrer в информацию о контроллере /actionn:

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

он должен дать вам что-то вроде

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

Ответ 3

Вот моя попытка, которая работает с 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