Raylar'daki bir filtrede geçerli rotayı bilmem gerekiyor. Ne olduğunu nasıl öğrenebilirim?
REST kaynakları yapıyorum ve adlandırılmış rota görmüyorum.
Raylar'daki bir filtrede geçerli rotayı bilmem gerekiyor. Ne olduğunu nasıl öğrenebilirim?
REST kaynakları yapıyorum ve adlandırılmış rota görmüyorum.
Yanıtlar:
URI'yı bulmak için:
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"
Rotayı, yani kontrolör, eylem ve parametreler bulmak için:
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]
ve params[:action]
. Ancak, bunun dışında, rotayı tanımak istiyorsanız, bu API artık kullanılamamaktadır. Şimdi değişti ActionDispatch::Routing
ve henüz denemedim recognize_path
.
request.path
Geçerli yolu bulmak için kullanmak daha iyidir .
request.env['ORIGINAL_FULLPATH']
, olası parametreleri yola dahil etmek için arayabilirsiniz , aşağıdaki cevabımı görün.
Bir görünümde özel bir şey yapmaya çalışıyorsanız, aşağıdaki gibi kullanabilirsiniz current_page?
:
<% if current_page?(:controller => 'users', :action => 'index') %>
... ya da bir eylem ve kimlik ...
<% if current_page?(:controller => 'users', :action => 'show', :id => 1) %>
... ya da adlandırılmış bir rota ...
<% if current_page?(users_path) %>
...ve
<% if current_page?(user_path(1)) %>
Çünkü current_page?
bir denetleyici ve eylemi hem gerektirir Sadece denetleyicisi umurumda, ben bir hale current_controller?
ApplicationController yöntemi:
def current_controller?(names)
names.include?(current_controller)
end
Ve şu şekilde kullanın:
<% if current_controller?('users') %>
... aynı zamanda birden fazla denetleyici adıyla da çalışır ...
<% if current_controller?(['users', 'comments']) %>
controller_name
ve action_name
bu tür şeyler için yardımcılar ve görünümlerde kullanmak için iyidir.
2015 yılında karşılaşabileceğim en basit çözüm (Rails 4 kullanılarak doğrulandı, ancak Rails 3 kullanılarak da çalışmalı)
request.url
# => "http://localhost:3000/lists/7/items"
request.path
# => "/lists/7/items"
<form action="<%= request.path %>">
Bunu yapabilirsiniz
Rails.application.routes.recognize_path "/your/path"
Benim için raylar 3.1.0.rc4 çalışır
Rails 3'te Rack :: Mount :: RouteSet nesnesine Rails.application.routes nesnesi üzerinden erişebilir ve ardından doğrudan tanıma işlevini çağırabilirsiniz
route, match, params = Rails.application.routes.set.recognize(controller.request)
ilk (en iyi) eşleşmeyi elde eden şu blok formu eşleşen rotaların üzerinden geçer:
Rails.application.routes.set.recognize(controller.request) do |r, m, p|
... do something here ...
end
Rotayı aldıktan sonra, rota adını route.name aracılığıyla alabilirsiniz. Geçerli istek yolunu değil, belirli bir URL'nin yol adını almanız gerekiyorsa, rafa geçmek için sahte bir istek nesnesini taklit etmeniz gerekir, görmek için ActionController :: Routing :: Routes.recognize_path nasıl yapıyorlar.
undefined method 'recognize' for #<Journey::Routes:0x007f893dcfa648>
@AmNaN önerisine dayanarak (daha fazla ayrıntı):
class ApplicationController < ActionController::Base
def current_controller?(names)
names.include?(params[:controller]) unless params[:controller].blank? || false
end
helper_method :current_controller?
end
Artık listeyi aktif olarak işaretlemek için bir gezinme düzeninde arayabilirsiniz:
<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>
İçin users
ve alerts
yolları current_page?
yeterli olacaktır:
current_page?(users_path)
current_page?(alerts_path)
Ancak iç içe yollar ve bir denetleyicinin tüm eylemleri için istekle (karşılaştırılabilir items
), current_controller?
benim için daha iyi bir yöntemdi:
resources :users do
resources :items
end
İlk menü girişi aşağıdaki yollar için bu şekilde aktiftir:
/users/x/items #index
/users/x/items/x #show
/users/x/items/new #new
/users/x/items/x/edit #edit
Veya daha zarif: request.path_info
Kaynak:
Rack Dokümanlarını İste
URI demek istediğini varsayacağım:
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
Aşağıdaki yorumunuza göre, denetleyicinin adına ihtiyacınız varsa, bunu yapabilirsiniz:
private
def pre_process
self.controller_name # Will return "order"
self.controller_class_name # Will return "OrderController"
end
self.
içinde self.controller_name
veself.controller_class_name
Parametrelere de ihtiyacınız varsa :
current_fullpath = request.env ['ORIGINAL_FULLPATH'] # Http://example.com/my/test/path?param_n=N # sonra current_fullpath "/ my / test / path? param_n = N"
Ve <%= debug request.env %>
mevcut tüm seçenekleri görmek için her zaman bir görünümde arama yapabileceğinizi unutmayın .
Request.Url
base url dışında yol almak için request.path #
Tüm güzergahları tırmıkla görebilirsiniz: güzergahlar (bu size yardımcı olabilir).
Bunu yapabilirsiniz:
def active_action?(controller)
'active' if controller.remove('/') == controller_name
end
Şimdi şöyle kullanabilirsiniz:
<%= link_to users_path, class: "some-class #{active_action? users_path}" %>