मुझे रेल में एक फिल्टर में वर्तमान मार्ग जानना होगा। मैं कैसे पता लगा सकता हूं कि यह क्या है?
मैं REST संसाधन कर रहा हूं, और कोई भी नामांकित मार्ग नहीं देख रहा हूं।
मुझे रेल में एक फिल्टर में वर्तमान मार्ग जानना होगा। मैं कैसे पता लगा सकता हूं कि यह क्या है?
मैं 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]
। हालांकि, इसके बाहर, यदि आप मार्ग को पहचानना चाहते हैं, तो यह एपीआई अब उपलब्ध नहीं है। यह अब स्थानांतरित हो गया है 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
इस प्रकार की चीजों के लिए सहायकों और विचारों में उपयोग के लिए अच्छे हैं।
सबसे सरल समाधान मैं 2015 में आ सकता हूं (रेल 4 का उपयोग करके सत्यापित, लेकिन रेल 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 रेल में काम करता है
रेल 3 में आप Rack का उपयोग कर सकते हैं :: Mount :: Rails.application.routes ऑब्जेक्ट के माध्यम से रूटसेट ऑब्जेक्ट, फिर उस पर कॉल पहचान सीधे
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
एक बार जब आपके पास मार्ग है, तो आप मार्ग का नाम मार्ग के माध्यम से प्राप्त कर सकते हैं। यदि आपको किसी विशेष URL के लिए रूट नाम प्राप्त करने की आवश्यकता है, वर्तमान अनुरोध पथ नहीं, तो आपको रैक से नीचे जाने के लिए नकली अनुरोध ऑब्जेक्ट को मॉक करने की आवश्यकता होगी, ActionController की जाँच करें :: रूटिंग :: Routes.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 #to को बेस url को छोड़कर रास्ता मिलता है
आप रेक के माध्यम से सभी मार्ग देख सकते हैं: मार्ग (यह आपकी मदद कर सकता है)।
तुम यह केर सकते हो:
def active_action?(controller)
'active' if controller.remove('/') == controller_name
end
अब, आप इस तरह का उपयोग कर सकते हैं:
<%= link_to users_path, class: "some-class #{active_action? users_path}" %>