Saya perlu tahu rute saat ini dalam filter di Rails. Bagaimana saya bisa mengetahui apa itu?
Saya sedang melakukan sumber daya REST, dan tidak melihat rute bernama.
Saya perlu tahu rute saat ini dalam filter di Rails. Bagaimana saya bisa mengetahui apa itu?
Saya sedang melakukan sumber daya REST, dan tidak melihat rute bernama.
Jawaban:
Untuk mengetahui 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"
Untuk mengetahui rute yaitu pengontrol, aksi dan params:
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]
dan params[:action]
. Namun, di luar itu, jika Anda ingin mengenali rute, API ini tidak tersedia lagi. Sekarang telah bergeser ke ActionDispatch::Routing
dan saya belum mencobanya recognize_path
.
request.path
untuk menemukan jalur saat ini.
request.env['ORIGINAL_FULLPATH']
untuk memasukkan parameter yang mungkin di jalur, lihat jawaban saya di bawah ini.
Jika Anda mencoba membuat kasus khusus sesuatu dalam tampilan, Anda dapat menggunakan current_page?
seperti pada:
<% if current_page?(:controller => 'users', :action => 'index') %>
... atau tindakan dan id ...
<% if current_page?(:controller => 'users', :action => 'show', :id => 1) %>
... atau rute bernama ...
<% if current_page?(users_path) %>
...dan
<% if current_page?(user_path(1)) %>
Karena current_page?
membutuhkan pengontrol dan aksi, saat saya peduli hanya pengontrolnya, saya membuat current_controller?
metode di ApplicationController:
def current_controller?(names)
names.include?(current_controller)
end
Dan gunakan seperti ini:
<% if current_controller?('users') %>
... yang juga berfungsi dengan beberapa nama pengontrol ...
<% if current_controller?(['users', 'comments']) %>
controller_name
dan action_name
baik untuk digunakan dalam pembantu dan pandangan untuk hal semacam ini juga.
Solusi paling sederhana yang dapat saya buat pada tahun 2015 (diverifikasi menggunakan Rails 4, tetapi juga harus bekerja menggunakan Rails 3)
request.url
# => "http://localhost:3000/lists/7/items"
request.path
# => "/lists/7/items"
<form action="<%= request.path %>">
Kamu bisa melakukan ini
Rails.application.routes.recognize_path "/your/path"
Ini bekerja untuk saya di rel 3.1.0.rc4
Di rel 3 Anda dapat mengakses objek Rack :: Mount :: RouteSet melalui objek Rails.application.routes, lalu panggil kenali di atasnya secara langsung
route, match, params = Rails.application.routes.set.recognize(controller.request)
yang mendapatkan kecocokan pertama (terbaik), bentuk blok berikut ini melingkupi rute yang cocok:
Rails.application.routes.set.recognize(controller.request) do |r, m, p|
... do something here ...
end
setelah Anda memiliki rute, Anda bisa mendapatkan nama rute melalui route.name. Jika Anda perlu mendapatkan nama rute untuk URL tertentu, bukan jalur permintaan saat ini, maka Anda harus membuat tiruan objek permintaan palsu untuk diturunkan ke rak, periksa ActionController :: Routing :: Routes :: Routes. Routogn.recognize_path untuk melihat bagaimana mereka melakukannya.
undefined method 'recognize' for #<Journey::Routes:0x007f893dcfa648>
Berdasarkan saran @AmNaN (lebih detail):
class ApplicationController < ActionController::Base
def current_controller?(names)
names.include?(params[:controller]) unless params[:controller].blank? || false
end
helper_method :current_controller?
end
Sekarang Anda dapat menyebutnya mis dalam tata letak navigasi untuk menandai item daftar sebagai aktif:
<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>
Untuk users
dan alerts
rute, current_page?
akan cukup:
current_page?(users_path)
current_page?(alerts_path)
Tetapi dengan rute bersarang dan permintaan untuk semua tindakan pengontrol (sebanding dengan items
), current_controller?
adalah metode yang lebih baik untuk saya:
resources :users do
resources :items
end
Entri menu pertama aktif untuk rute-rute berikut:
/users/x/items #index
/users/x/items/x #show
/users/x/items/new #new
/users/x/items/x/edit #edit
Atau, lebih elegan: request.path_info
Sumber:
Dokumentasi Rak Permintaan
Saya akan menganggap Anda maksud 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
Sesuai komentar Anda di bawah ini, jika Anda membutuhkan nama controller, Anda dapat melakukan ini:
private
def pre_process
self.controller_name # Will return "order"
self.controller_class_name # Will return "OrderController"
end
self.
masuk self.controller_name
danself.controller_class_name
Jika Anda juga membutuhkan parameter :
current_fullpath = request.env ['ORIGINAL_FULLPATH'] # Jika Anda menjelajahi http://example.com/my/test/path?param_n=N # lalu current_fullpath akan menunjuk ke "/ my / test / path? param_n = N"
Dan ingat Anda selalu dapat memanggil <%= debug request.env %>
dalam tampilan untuk melihat semua opsi yang tersedia.
request.url
request.path #untuk mendapatkan path kecuali url dasar
Anda dapat melihat semua rute melalui rake: route (ini mungkin membantu Anda).
Kamu bisa melakukan ini:
def active_action?(controller)
'active' if controller.remove('/') == controller_name
end
Sekarang, Anda dapat menggunakan seperti ini:
<%= link_to users_path, class: "some-class #{active_action? users_path}" %>