রেলগুলির একটি ফিল্টারে আমার বর্তমান রুটটি জানতে হবে। কীভাবে তা জানতে পারি?
আমি আরআরএসটি রিসোর্সগুলি করছি, এবং কোনও নামকৃত রুট দেখতে পাচ্ছি না।
রেলগুলির একটি ফিল্টারে আমার বর্তমান রুটটি জানতে হবে। কীভাবে তা জানতে পারি?
আমি আরআরএসটি রিসোর্সগুলি করছি, এবং কোনও নামকৃত রুট দেখতে পাচ্ছি না।
উত্তর:
ইউআরআই সন্ধান করতে:
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?
অ্যাপ্লিকেশন নিয়ন্ত্রণকারীটিতে একটি পদ্ধতি করি :
def current_controller?(names)
names.include?(current_controller)
end
এবং এটি এর মতো ব্যবহার করুন:
<% if current_controller?('users') %>
... যা একাধিক নিয়ামকের নামের সাথেও কাজ করে ...
<% if current_controller?(['users', 'comments']) %>
controller_name
এবং action_name
এই ধরণের জিনিসটির জন্য সহায়ক এবং দর্শনগুলিতে ব্যবহারের জন্য ভাল।
২০১৫ সালে সবচেয়ে সহজ সমাধানটি আমি নিয়ে আসতে পারি (রেল 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 রেলগুলিতে আপনি রেল :: মাউন্ট :: রাটসেট অবজেক্টটি রেলস.অ্যাপ্লিকেশন.আর্টসেস অবজেক্টের মাধ্যমে অ্যাক্সেস করতে পারবেন, তারপরে সরাসরি এটিতে স্বীকৃতি কল করুন
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
একবার আপনি রুট হয়ে গেলে, আপনি রুট.নামের মাধ্যমে রুটের নামটি পেতে পারেন। আপনার যদি এখনকার অনুরোধের পাথের পরিবর্তে কোনও নির্দিষ্ট ইউআরএলটির জন্য রুটের নামটি পাওয়া দরকার, তবে আপনাকে র্যাকটি পাস করার জন্য একটি নকল অনুরোধের বিষয়টিকে উপহাস করতে হবে, এটি দেখতে অ্যাকশনকন্ট্রোলার :: রাউটিং :: রুটস.রিগনাইজ_পথ দেখুন তারা কিভাবে এটি করছে।
undefined method 'recognize' for #<Journey::Routes:0x007f893dcfa648>
@ আম্ননা পরামর্শের ভিত্তিতে (আরও বিশদ):
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
উত্স:
অনুরোধ র্যাক ডকুমেন্টেশন
আমি ধরে নেব আপনি ইউআরআই বলতে চাইছেন:
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
আপনার যদি প্যারামিটারগুলিও দরকার থাকে :
কারেন্ট_ফুলপাথ = অনুরোধ.এএনভি ['ORIGINAL_FULLPATH'] # আপনি যদি http://example.com/my/test/path?param_n=N ব্রাউজ করছেন # তাহলে বর্তমান_ফুলপথ "/ আমার / পরীক্ষা / পথ? পরম_ন = এন" নির্দেশ করবে
এবং মনে রাখবেন <%= debug request.env %>
যে সমস্ত উপলভ্য বিকল্পগুলি দেখতে আপনি সর্বদা একটি দৃশ্যে কল করতে পারেন ।
request.url
অনুরোধ.পথটি বেস url ব্যতীত পথ পেতে path
আপনি রেকের মাধ্যমে সমস্ত রুট দেখতে পাবেন: রুটগুলি (এটি আপনাকে সহায়তা করতে পারে)।
তুমি এটি করতে পারো:
def active_action?(controller)
'active' if controller.remove('/') == controller_name
end
এখন, আপনি এটি ব্যবহার করতে পারেন:
<%= link_to users_path, class: "some-class #{active_action? users_path}" %>