রেলের বর্তমান রুটটি আমি কীভাবে সন্ধান করতে পারি?


210

রেলগুলির একটি ফিল্টারে আমার বর্তমান রুটটি জানতে হবে। কীভাবে তা জানতে পারি?

আমি আরআরএসটি রিসোর্সগুলি করছি, এবং কোনও নামকৃত রুট দেখতে পাচ্ছি না।


3
আপনি এটি দিয়ে কী সম্পাদন করার চেষ্টা করছেন? আপনি যখন "রুট" বলছেন তখন আপনার কি "ইউআরআই" মানে?
jdl

মিডওয়্যারটিতে এটি কীভাবে পাবেন সে সম্পর্কে কোনও চিন্তাভাবনা ।
সৌরভ

উত্তর:


197

ইউআরআই সন্ধান করতে:

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এখনও এটি ব্যবহার করে দেখিনি ।
সোয়ানান্দ

37
request.pathবর্তমানের পথটি সন্ধান করার জন্য এটি ব্যবহার করা ভাল ।
ড্যানিয়েল ব্রকম্যান

2
আপনি request.env['ORIGINAL_FULLPATH']পথটিতে সম্ভাব্য পরামিতিগুলি অন্তর্ভুক্ত করার জন্যও কল করতে পারেন, নীচে আমার উত্তর দেখুন।
ডুআরমে

2
কারেন্ট_উরি = অনুরোধ.env ['PATH_INFO'] ট্রেলিং_স্ল্যাশ রুটে সেট করা থাকলে কাজ করে না
গেডিমিনাস

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?অ্যাপ্লিকেশন নিয়ন্ত্রণকারীটিতে একটি পদ্ধতি করি :

  def current_controller?(names)
    names.include?(current_controller)
  end

এবং এটি এর মতো ব্যবহার করুন:

<% if current_controller?('users') %>

... যা একাধিক নিয়ামকের নামের সাথেও কাজ করে ...

<% if current_controller?(['users', 'comments']) %>

27
নোট করুন যে আপনি কারেন্ট_পেজটিও ব্যবহার করতে পারবেন? নাম দেওয়া রুটের সাথে: কারেন্ট_পেজ? (ব্যবহারকারী_পথ)
টোথেমারিও

দুর্দান্ত তোথেরিও। আমি এটা জানতাম না। আমি উত্তরটি পরিবর্তন করছি।
IAmNaN

এটি "/ ব্যবহারকারী", "/ ব্যবহারকারী /", "/ ব্যবহারকারীগণ? স্মেথ = এসডিফাসফ" যাই হোক না কেন ঠিকানাটি সত্য করে দেয় .... কখনও কখনও অনুশীলনে এত ভাল জিনিস হয় না
গেডিমিনাস

4
controller_nameএবং action_nameএই ধরণের জিনিসটির জন্য সহায়ক এবং দর্শনগুলিতে ব্যবহারের জন্য ভাল।
ম্যাট কনলি

1
একটি দৃশ্যে আপনি কেবল <% করতে পারেন যদি প্যারামগুলি [: ক্রিয়া] == 'দেখান'%> যাতে আপনার
নিয়ামকের

149

২০১৫ সালে সবচেয়ে সহজ সমাধানটি আমি নিয়ে আসতে পারি (রেল 4 ব্যবহার করে যাচাই করা হয়েছে, তবে এটিও 3 টি রেল ব্যবহার করে কাজ করা উচিত)

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

1
এবং আপনি যদি
ভিউটিতে

এটা সত্যিই দারুন! নতুন প্যারামের সাথে বর্তমান পৃষ্ঠায় পুনর্নির্দেশ করতে এটি আংশিক আকারে ব্যবহার করুন। <form action="<%= request.path %>">
xHocquet


11

3 রেলগুলিতে আপনি রেল :: মাউন্ট :: রাটসেট অবজেক্টটি রেলস.অ্যাপ্লিকেশন.আর্টসেস অবজেক্টের মাধ্যমে অ্যাক্সেস করতে পারবেন, তারপরে সরাসরি এটিতে স্বীকৃতি কল করুন

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

একবার আপনি রুট হয়ে গেলে, আপনি রুট.নামের মাধ্যমে রুটের নামটি পেতে পারেন। আপনার যদি এখনকার অনুরোধের পাথের পরিবর্তে কোনও নির্দিষ্ট ইউআরএলটির জন্য রুটের নামটি পাওয়া দরকার, তবে আপনাকে র্যাকটি পাস করার জন্য একটি নকল অনুরোধের বিষয়টিকে উপহাস করতে হবে, এটি দেখতে অ্যাকশনকন্ট্রোলার :: রাউটিং :: রুটস.রিগনাইজ_পথ দেখুন তারা কিভাবে এটি করছে।


5
ত্রুটি:undefined method 'recognize' for #<Journey::Routes:0x007f893dcfa648>
fguillen

7

@ আম্ননা পরামর্শের ভিত্তিতে (আরও বিশদ):

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

আমি ধরে নেব আপনি ইউআরআই বলতে চাইছেন:

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
weltschmerz

4

আপনার যদি প্যারামিটারগুলিও দরকার থাকে :

কারেন্ট_ফুলপাথ = অনুরোধ.এএনভি ['ORIGINAL_FULLPATH']
# আপনি যদি http://example.com/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}" %>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.