Rails에서 현재 경로를 어떻게 알 수 있습니까?


211

Rails의 필터에서 현재 경로를 알아야합니다. 그것이 무엇인지 어떻게 알 수 있습니까?

REST 리소스를 사용하고 있으며 이름이 지정된 경로가 없습니다.


3
이것으로 무엇을 성취하려고합니까? "경로"라고 할 때 "URI"를 의미합니까?
jdl

미들웨어 로 가져 오는 방법에 대한 생각 .
Saurabh

답변:


197

URI를 찾으려면

current_uri = request.env['PATH_INFO']
# If you are browsing http://example.com/my/test/path, 
# then above line will yield current_uri as "/my/test/path"

경로, 즉 컨트롤러, 동작 및 매개 변수를 찾으려면 다음을 수행하십시오.

path = ActionController::Routing::Routes.recognize_path "/your/path/here/"

# ...or newer Rails versions:
#
path = Rails.application.routes.recognize_path('/your/path/here')

controller = path[:controller]
action = path[:action]
# You will most certainly know that params are available in 'params' hash

2
이것이 Rails 3에서 동일하고 올바른 방법인지 알고 싶습니까? 여전히 액세스 할 수 있다고 확신하지만 최신 규칙을 준수하고 싶습니다.
John

37
현재 컨트롤러 및 작업은 params[:controller]및 에서 항상 사용할 수 있습니다 params[:action]. 그러나 경로 외부에서 경로를 인식하려면이 API를 더 이상 사용할 수 없습니다. 이제는 바뀌었고 아직 ActionDispatch::Routing시도하지 recognize_path않았습니다.
Swanand

38
request.path현재 경로를 찾는 데 사용 하는 것이 좋습니다 .
Daniel Brockman

2
request.env['ORIGINAL_FULLPATH']경로에 가능한 매개 변수를 포함하도록 호출 할 수도 있습니다 ( 아래 내 답변 참조).
DuArme

2
trailing_slash가 경로에 설정되어 있으면 current_uri = request.env [ 'PATH_INFO']가 작동하지 않습니다
Gediminas

297

뷰에서 무언가를 특수하게 처리하려는 경우 다음과 current_page?같이 사용할 수 있습니다 .

<% if current_page?(:controller => 'users', :action => 'index') %>

... 또는 행동과 아이디 ...

<% if current_page?(:controller => 'users', :action => 'show', :id => 1) %>

... 또는 명명 된 노선 ...

<% if current_page?(users_path) %>

...과

<% if current_page?(user_path(1)) %>

current_page?컨트롤러와 액션이 모두 필요 하기 때문에 컨트롤러 만 신경 쓰면 current_controller?ApplicationController 에서 메소드를 만듭니다 .

  def current_controller?(names)
    names.include?(current_controller)
  end

그리고 이것을 다음과 같이 사용하십시오 :

<% if current_controller?('users') %>

... 여러 컨트롤러 이름에서도 작동합니다 ...

<% if current_controller?(['users', 'comments']) %>

27
current_page를 사용할 수도 있습니까? 이름이 지정된 노선 : current_page? (users_path)
tothemario

좋은 tothemario. 나는 몰랐다. 답변을 수정하고 있습니다.
IAmNaN

"/ users", "/ users /", "/ users? smth = sdfasf"등의 주소가 무엇이든 true를 반환합니다. 실제로는 좋지 않은 경우도 있습니다
Gediminas

4
controller_nameaction_name도 이런 종류의 물건에 대한 헬퍼 및 뷰에서 사용하기에 좋다.
매트 코놀리

1
보기에서 <
ms

150

2015 년에 생각해 볼 수있는 가장 간단한 솔루션 (Rails 4를 사용하여 확인되었지만 Rails 3을 사용하여 작동해야 함)

request.url
# => "http://localhost:3000/lists/7/items"
request.path
# => "/lists/7/items"

1
그리고보기에서 id를 원한다면 : <% = request.path_parameters [: id] %>
rmcsharry

대단해! 새로운 매개 변수를 사용하여 현재 페이지로 리디렉션하려면이를 부분 형식으로 사용하십시오. <form action="<%= request.path %>">
xHocquet

19

당신은 이것을 할 수 있습니다

Rails.application.routes.recognize_path "/your/path"

레일 3.1.0.rc4에서 작동합니다.


11

레일 3에서는 Rails.application.routes 객체를 통해 Rack :: Mount :: RouteSet 객체에 액세스 한 다음 바로 인식을 호출 할 수 있습니다.

route, match, params = Rails.application.routes.set.recognize(controller.request)

첫 번째 (최고) 일치를 얻으면 다음 블록 형식이 일치하는 경로를 반복합니다.

Rails.application.routes.set.recognize(controller.request) do |r, m, p|
  ... do something here ...
end

경로가 있으면 route.name을 통해 경로 이름을 얻을 수 있습니다. 현재 요청 경로가 아닌 특정 URL의 경로 이름을 가져와야하는 경우 가짜 요청 객체를 모아 랙에 전달해야합니다. ActionController :: Routing :: Routes.recognize_path를 확인하십시오. 그들이 어떻게하고 있는지


5
오류 :undefined method 'recognize' for #<Journey::Routes:0x007f893dcfa648>
fguillen

7

@AmNaN 제안을 기반으로 (자세한 내용) :

class ApplicationController < ActionController::Base

 def current_controller?(names)
  names.include?(params[:controller]) unless params[:controller].blank? || false
 end

 helper_method :current_controller?

end

이제 목록 항목을 활성으로 표시하기위한 탐색 레이아웃에서 호출 할 수 있습니다.

<ul class="nav nav-tabs">
  <li role="presentation" class="<%= current_controller?('items') ? 'active' : '' %>">
    <%= link_to user_items_path(current_user) do %>
      <i class="fa fa-cloud-upload"></i>
    <% end %>
  </li>
  <li role="presentation" class="<%= current_controller?('users') ? 'active' : '' %>">
    <%= link_to users_path do %>
      <i class="fa fa-newspaper-o"></i>
    <% end %>
  </li>
  <li role="presentation" class="<%= current_controller?('alerts') ? 'active' : '' %>">
    <%= link_to alerts_path do %>
      <i class="fa fa-bell-o"></i>
    <% end %>
  </li>
</ul>

들어 usersalerts경로 current_page?충분하다 :

 current_page?(users_path)
 current_page?(alerts_path)

그러나 중첩 된 경로와 컨트롤러의 모든 작업에 대한 요청 (와 비교할 수있는 items) current_controller?이 더 나은 방법이었습니다.

 resources :users do 
  resources :items
 end

첫 번째 메뉴 항목은 다음 경로에 대해 활성화 된 방식입니다.

   /users/x/items        #index
   /users/x/items/x      #show
   /users/x/items/new    #new
   /users/x/items/x/edit #edit


4

URI를 의미한다고 가정합니다.

class BankController < ActionController::Base
  before_filter :pre_process 

  def index
    # do something
  end

  private
    def pre_process
      logger.debug("The URL" + request.url)
    end
end

아래 의견에 따라 컨트롤러 이름이 필요한 경우 간단히 다음을 수행 할 수 있습니다.

  private
    def pre_process
      self.controller_name        #  Will return "order"
      self.controller_class_name  # Will return "OrderController"
    end

예, 그렇게했지만 더 나은 방식으로 바랐습니다. 내가 필요한 것은 어떤 컨트롤러가 호출 되었는 지 아는 것이지만, 상당히 복잡한 중첩 리소스가 있습니다. request.path_parameters ( 'controller')가 제대로 작동하지 않는 것 같습니다.
luca

필요 없음 self.self.controller_nameself.controller_class_name
weltschmerz

4

당신은 또한 매개 변수 가 필요합니다 :

current_fullpath = request.env [ 'ORIGINAL_FULLPATH']
# http://example.com/my/test/path?param_n=N을 탐색하는 경우 
# current_fullpath는 "/ my / test / path? param_n = N"을 가리 킵니다.

<%= debug request.env %>사용 가능한 모든 옵션을 보려면 항상 보기에서 호출 할 수 있습니다.



2

rake : routes를 통해 모든 경로를 볼 수 있습니다 (이것이 도움이 될 수 있습니다).


경로가 잘못된 새 탭을 열고 브라우저의 모든 경로 / 경로가 더 예쁘기 때문에 브라우저에서 모든 경로 / 경로를 보는 것이 좋습니다. 그러나 이것이 현재 경로를 얻는 데 도움이되지 않는다고 생각합니다.
ahnbizcad

0

request.env['REQUEST_URI']요청 된 전체 URI를 볼 수 있습니다 . 다음과 같이 출력됩니다.

http://localhost:3000/client/1/users/1?name=test

0

당신은 이것을 할 수 있습니다 :

def active_action?(controller)
   'active' if controller.remove('/') == controller_name
end

이제 다음과 같이 사용할 수 있습니다.

<%= link_to users_path, class: "some-class #{active_action? users_path}" %>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.