Ruby on Rails: احصل على وحدة التحكم واسم العمل بناءً على مسار

StackOverflow https://stackoverflow.com/questions/3457067

  •  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

هل هذا يساعد ، أم أنك تحتاج حقًا إلى تحليل سلسلة للقيام بذلك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top