Ruby on Rails: احصل على وحدة التحكم واسم العمل بناءً على مسار
-
27-09-2019 - |
سؤال
أحاول الحصول على وحدة التحكم واسم العمل بناءً على مسار. لدي طريق:
map.resources :permissions
اعتقدت أنه يمكنني استخدام:
ActionController::Routing::Routes.recognize_path "/permissions/1"
للحصول على تجزئة مثل:
{ :controller => "permissions", :action => "show" }
التجزئة الفعلية التي تعود هي:
{ :controller => "permissions", :action => "1" }
كيف أحصل على اسم الإجراء الصحيح بدلاً من مجرد تمريره في الهوية؟ يجب أن يكون المرسل قادرًا على الوصول إليه بطريقة ما أو لن ينجح القضبان ، لكنني أواجه مشكلة في تحديد كيفية تحقيق ذلك.
المحلول 3
هذا ما انتهى بي الأمر. إنه قبيح ويجب أن يكون هناك طريقة أفضل ، لكنه يعمل الآن. يحدث ذلك في A قبل_filter حتى أتمكن من معرفة ما إذا كان لدى المستخدم الوصول إلى وحدة التحكم / الإجراء الذي يحاول الوصول إليه.
اخترت استخدام التفويض القائم على المسار بدلاً من التفويض القائم على النماذج.
# Get method of current request
method = options[:method] ? options[:method] : 'get'
# Create a new request - hate this that is required
env = Rack::MockRequest.env_for(url, {:method => method})
request = ActionController::Request.new(env)
# For some reason, calling this fills in the controller / action information for the request
# just using recognize_path doesn't work correctly with resources...
ActionController::Routing::Routes.recognize(request)
ثم يمكنك الوصول إلى وحدة التحكم والإجراء باستخدام request.params [: Controller] و request.params [: Action].
لن يكون كل هذا ضروريًا إذا أعاد ActionController :: Routing :: Roates.Rectlize_Path ("/أذونات/1") الإجراء الصحيح.
نصائح أخرى
اعتبارًا من Rails 4 طريقة التعرف على المسار الآن Rails.application.routes.recognize_path
في مقابل ActionController::Routing::Routes.recognize_path
ويعيد تجزئة من وحدة التحكم والعمل والمعرف مثل:
Rails.application.routes.recognize_path(app.edit_somecontroller_path(1))
=> {:controller=>"somecontroller", :action=>"edit", :id=>"1"}
ماذا أنت حقا بعد؟ إذا كنت حقًا بعد اسم الإجراء واسم وحدة التحكم ... يمكنك فقط أن تطلب
controller.controller_name
و
controller.action_name
هل هذا يساعد ، أم أنك تحتاج حقًا إلى تحليل سلسلة للقيام بذلك؟