ฉันจำเป็นต้องรู้เส้นทางปัจจุบันในตัวกรองใน Rails ฉันจะรู้ได้อย่างไรว่ามันคืออะไร?
ฉันกำลังทำแหล่งข้อมูล REST และไม่พบเส้นทางที่ระบุชื่อ
ฉันจำเป็นต้องรู้เส้นทางปัจจุบันในตัวกรองใน Rails ฉันจะรู้ได้อย่างไรว่ามันคืออะไร?
ฉันกำลังทำแหล่งข้อมูล REST และไม่พบเส้นทางที่ระบุชื่อ
คำตอบ:
หากต้องการค้นหา 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
params[:controller]
params[:action]
อย่างไรก็ตามนอกนั้นถ้าคุณต้องการรับรู้เส้นทาง API นี้ไม่สามารถใช้ได้อีกต่อไป ตอนนี้มันเปลี่ยนไปเป็นActionDispatch::Routing
และฉันยังไม่ได้ลองrecognize_path
เลย
request.path
เพื่อค้นหาเส้นทางปัจจุบัน
request.env['ORIGINAL_FULLPATH']
เพื่อรวมพารามิเตอร์ที่เป็นไปได้ในเส้นทางดูคำตอบของฉันด้านล่าง
หากคุณกำลังพยายามหากรณีพิเศษในมุมมองคุณสามารถใช้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']) %>
controller_name
และaction_name
เป็นสิ่งที่ดีสำหรับการใช้งานในผู้ช่วยเหลือและมุมมองสำหรับสิ่งต่าง ๆ เช่นนี้
ทางออกที่ง่ายที่สุดที่ฉันสามารถทำได้ในปี 2558 (ตรวจสอบโดยใช้ Rails 4 แต่ควรใช้กับ Rails 3 ด้วย)
request.url
# => "http://localhost:3000/lists/7/items"
request.path
# => "/lists/7/items"
<form action="<%= request.path %>">
คุณสามารถทำได้
Rails.application.routes.recognize_path "/your/path"
มันใช้งานได้สำหรับฉันในราง 3.1.0.rc4
ใน Rails 3 คุณสามารถเข้าถึงวัตถุ Rack :: Mount :: RouteSet ผ่านทาง Rails.application.routes object จากนั้นเรียกการรับรู้โดยตรง
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.recognize_path พวกเขาทำมันอย่างไร
undefined method 'recognize' for #<Journey::Routes:0x007f893dcfa648>
ตามข้อเสนอแนะ @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>
สำหรับusers
และalerts
เส้นทาง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
หรืออย่างหรูหรามากขึ้น: request.path_info
ที่มา:
ขอเอกสารประกอบชั้นวาง
ฉันจะถือว่าคุณหมายถึง 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
self.
เข้าself.controller_name
และออกself.controller_class_name
หากคุณต้องการพารามิเตอร์ :
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 %>
ในมุมมองเพื่อดูตัวเลือกที่มีทั้งหมด
request.url
request.path # เพื่อรับเส้นทางยกเว้น url ฐาน
คุณสามารถดูเส้นทางทั้งหมดผ่าน rake: เส้นทาง (สิ่งนี้อาจช่วยคุณได้)
คุณสามารถทำได้request.env['REQUEST_URI']
เพื่อดู URI ที่ขอทั้งหมด .. มันจะแสดงผลบางอย่างดังนี้
http://localhost:3000/client/1/users/1?name=test
คุณสามารถทำได้:
def active_action?(controller)
'active' if controller.remove('/') == controller_name
end
ตอนนี้คุณสามารถใช้สิ่งนี้:
<%= link_to users_path, class: "some-class #{active_action? users_path}" %>