मैं रेल में वर्तमान मार्ग का पता कैसे लगा सकता हूं?


211

मुझे रेल में एक फिल्टर में वर्तमान मार्ग जानना होगा। मैं कैसे पता लगा सकता हूं कि यह क्या है?

मैं REST संसाधन कर रहा हूं, और कोई भी नामांकित मार्ग नहीं देख रहा हूं।


3
क्या आप इसे पूरा करने की कोशिश कर रहे हैं? जब आप कहते हैं कि "मार्ग" का अर्थ है "यूआरआई"?
jdl

इसे मिडलवेयर में कैसे लाया जाए, इस पर कोई विचार ।
सौरभ

जवाबों:


197

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

2
क्या आपको पता होगा कि अगर यह रेल 3 में ऐसा ही / सही तरीका है? मुझे यकीन है कि यह अभी भी सुलभ है, लेकिन मैं सिर्फ यह सुनिश्चित करना चाहता हूं कि मैं नवीनतम सम्मेलनों का पालन कर रहा हूं।
जॉन

37
वर्तमान नियंत्रक और कार्रवाई हमेशा में उपलब्ध हैं params[:controller]और params[:action]। हालांकि, इसके बाहर, यदि आप मार्ग को पहचानना चाहते हैं, तो यह एपीआई अब उपलब्ध नहीं है। यह अब स्थानांतरित हो गया है ActionDispatch::Routingऔर मैंने recognize_pathअभी तक इस पर प्रयास नहीं किया है।
स्वानंद

38
request.pathवर्तमान पथ खोजने के लिए उपयोग करना बेहतर है ।
डैनियल ब्रोकमैन

2
आप request.env['ORIGINAL_FULLPATH']पथ में संभावित मापदंडों को शामिल करने के लिए भी कॉल कर सकते हैं , नीचे मेरा जवाब देखें।
ड्यूरामे

2
current_uri = request.env ['PATH_INFO'] काम नहीं करता है यदि ट्रेलिंग_लैश मार्गों में सेट किया गया है
Gediminas

297

यदि आप किसी दृश्य में कुछ विशेष करने की कोशिश कर रहे हैं, तो आप इस 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']) %>

27
ध्यान दें कि आप current_page का भी उपयोग कर सकते हैं? मार्गों के नाम के साथ: current_page? (users_path)
टोटेमेरियो

अच्छा कुलदेवता। मुझे नहीं पता था। मैं उत्तर को संशोधित कर रहा हूं।
IANNNN

यह सही है जो कुछ भी पता है "/ उपयोगकर्ता", "/ उपयोगकर्ता /", "/ उपयोगकर्ता? smth = sdfasf" .... कभी-कभी व्यवहार में इतनी अच्छी बात नहीं है
Gediminas

4
controller_nameऔर action_nameइस प्रकार की चीजों के लिए सहायकों और विचारों में उपयोग के लिए अच्छे हैं।
मैट कोनोली

1
एक दृश्य में आप बस <% कर सकते हैं अगर परमेस [: एक्शन] == 'शो'%> तो आपको नियंत्रक की आवश्यकता नहीं है
rmcsharry

150

सबसे सरल समाधान मैं 2015 में आ सकता हूं (रेल 4 का उपयोग करके सत्यापित, लेकिन रेल 3 का उपयोग करके भी काम करना चाहिए)

request.url
# => "http://localhost:3000/lists/7/items"
request.path
# => "/lists/7/items"

1
और यदि आप दृश्य में आईडी चाहते हैं: <% = request.path_parameters [: id]%>
rmcsharry

यह कमाल का है! नए पृष्ठ के साथ वर्तमान पृष्ठ पर पुनर्निर्देशित करने के लिए इसे आंशिक रूप में उपयोग करें। <form action="<%= request.path %>">
22

19

तुम यह केर सकते हो

Rails.application.routes.recognize_path "/your/path"

यह मेरे लिए 3.1.0.rc4 रेल में काम करता है


11

रेल 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 देखने के लिए वे यह कैसे कर रहे हैं।


5
त्रुटि:undefined method 'recognize' for #<Journey::Routes:0x007f893dcfa648>
fugillen

7

@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


4

मैं मान लूंगा कि आपका मतलब 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

हां मैंने ऐसा किया था, लेकिन मैं बेहतर तरीके से उम्मीद करता था। मुझे यह जानने की जरूरत है कि किस कंट्रोलर को बुलाया गया है, लेकिन मेरे पास बहुत जटिल नेस्टेड संसाधन हैं। request.path_parameters ('कंट्रोलर') मुझे ठीक से काम नहीं करता।
लूका

self.में self.controller_nameऔर कोई ज़रूरत नहीं हैself.controller_class_name
weltschmerz

4

क्या आपको मापदंडों की भी आवश्यकता है :

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 %>उपलब्ध सभी विकल्पों को देखने के लिए एक दृश्य में कॉल कर सकते हैं।



2

आप रेक के माध्यम से सभी मार्ग देख सकते हैं: मार्ग (यह आपकी मदद कर सकता है)।


मैं एक अमान्य पथ के साथ एक नया टैब खोलना पसंद करता हूं, और ब्राउज़र से सभी पथ / मार्गों को देखता हूं, क्योंकि वे उस तरह से पहले से ही हैं। लेकिन मुझे नहीं लगता कि इससे वर्तमान मार्ग को प्राप्त करने में मदद मिलती है।
एहनबिजद

0

आप request.env['REQUEST_URI']पूर्ण अनुरोधित यूआरआई को देख सकते हैं .. यह नीचे की तरह कुछ आउटपुट देगा

http://localhost:3000/client/1/users/1?name=test

0

तुम यह केर सकते हो:

def active_action?(controller)
   'active' if controller.remove('/') == controller_name
end

अब, आप इस तरह का उपयोग कर सकते हैं:

<%= link_to users_path, class: "some-class #{active_action? users_path}" %>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.