Muszę znać bieżącą trasę w filtrze w Railsach. Jak mogę dowiedzieć się, co to jest?
Korzystam z zasobów REST i nie widzę nazwanych tras.
Muszę znać bieżącą trasę w filtrze w Railsach. Jak mogę dowiedzieć się, co to jest?
Korzystam z zasobów REST i nie widzę nazwanych tras.
Odpowiedzi:
Aby znaleźć identyfikator 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"
Aby znaleźć trasę, tj. Kontroler, akcję i parametry:
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
params[:controller]
i params[:action]
. Jednak poza tym, jeśli chcesz rozpoznać trasę, ten interfejs API nie jest już dostępny. Teraz się zmieniło ActionDispatch::Routing
i jeszcze tego nie wypróbowałem recognize_path
.
request.path
do znalezienia bieżącej ścieżki.
request.env['ORIGINAL_FULLPATH']
celu włączenia możliwych parametrów do ścieżki, zobacz moją odpowiedź poniżej.
Jeśli próbujesz specjalną skrzynkę w widoku, możesz użyć current_page?
jak w:
<% if current_page?(:controller => 'users', :action => 'index') %>
... lub akcja i identyfikator ...
<% if current_page?(:controller => 'users', :action => 'show', :id => 1) %>
... lub nazwana trasa ...
<% if current_page?(users_path) %>
...i
<% if current_page?(user_path(1)) %>
Ponieważ current_page?
wymaga zarówno kontrolera, jak i akcji, kiedy zależy mi tylko na kontrolerze, tworzę current_controller?
metodę w ApplicationController:
def current_controller?(names)
names.include?(current_controller)
end
I użyj tego w ten sposób:
<% if current_controller?('users') %>
... który działa również z wieloma nazwami kontrolerów ...
<% if current_controller?(['users', 'comments']) %>
controller_name
i action_name
są dobre do użycia w pomocnikach i widokach tego typu rzeczy.
Najprostsze rozwiązanie, jakie mogę wymyślić w 2015 r. (Zweryfikowane przy użyciu Rails 4, ale powinno również działać przy użyciu Rails 3)
request.url
# => "http://localhost:3000/lists/7/items"
request.path
# => "/lists/7/items"
<form action="<%= request.path %>">
Możesz to zrobić
Rails.application.routes.recognize_path "/your/path"
Działa dla mnie w szynach 3.1.0.rc4
W szynach 3 można uzyskać dostęp do obiektu Rack :: Mount :: RouteSet za pośrednictwem obiektu Rails.application.routes, a następnie wywołać rozpoznawanie bezpośrednio na nim
route, match, params = Rails.application.routes.set.recognize(controller.request)
która otrzymuje pierwsze (najlepsze) dopasowanie, następująca pętla formularza blokuje pasujące trasy:
Rails.application.routes.set.recognize(controller.request) do |r, m, p|
... do something here ...
end
gdy już znajdziesz trasę, możesz uzyskać nazwę trasy poprzez route.name. Jeśli chcesz uzyskać nazwę trasy dla określonego adresu URL, a nie bieżącą ścieżkę żądania, musisz wyodrębnić fałszywy obiekt żądania, aby przekazać go do szafy, sprawdź ActionController :: Routing :: Routes.recognize_path, aby zobaczyć jak oni to robią.
undefined method 'recognize' for #<Journey::Routes:0x007f893dcfa648>
Na podstawie sugestii @AmNaN (więcej szczegółów):
class ApplicationController < ActionController::Base
def current_controller?(names)
names.include?(params[:controller]) unless params[:controller].blank? || false
end
helper_method :current_controller?
end
Teraz możesz to nazwać np. W układzie nawigacyjnym, aby oznaczyć elementy listy jako aktywne:
<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>
Dla tras users
i wystarczyłoby:alerts
current_page?
current_page?(users_path)
current_page?(alerts_path)
Ale przy zagnieżdżonych trasach i żądaniach dotyczących wszystkich działań kontrolera (porównywalnych z items
) current_controller?
była dla mnie lepsza metoda:
resources :users do
resources :items
end
Pierwsza pozycja menu jest w ten sposób aktywna dla następujących tras:
/users/x/items #index
/users/x/items/x #show
/users/x/items/new #new
/users/x/items/x/edit #edit
Lub bardziej elegancko: request.path_info
Zakładam, że masz na myśli identyfikator 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
Zgodnie z komentarzem poniżej, jeśli potrzebujesz nazwy kontrolera, możesz po prostu to zrobić:
private
def pre_process
self.controller_name # Will return "order"
self.controller_class_name # Will return "OrderController"
end
self.
w self.controller_name
iself.controller_class_name
Jeśli potrzebujesz również parametrów :
current_fullpath = request.env ['ORIGINAL_FULLPATH'] # Jeśli przeglądasz http://example.com/my/test/path?param_n=N # wtedy current_fullpath wskaże na „/ my / test / path? param_n = N”
I pamiętaj, że zawsze możesz zadzwonić <%= debug request.env %>
w widoku, aby zobaczyć wszystkie dostępne opcje.
request.url
request.path # aby uzyskać ścieżkę oprócz podstawowego adresu URL
Możesz zobaczyć wszystkie trasy poprzez prowizję: trasy (może ci to pomóc).
Możesz to zrobić:
def active_action?(controller)
'active' if controller.remove('/') == controller_name
end
Teraz możesz użyć w ten sposób:
<%= link_to users_path, class: "some-class #{active_action? users_path}" %>