2010-08-11 17 views
15

पर आधारित नियंत्रक और क्रिया का नाम प्राप्त करें मैं पथ पर आधारित नियंत्रक और क्रिया नाम प्राप्त करने का प्रयास कर रहा हूं। मैं एक मार्ग है:रेल पर रूबी: पथ

map.resources :permissions 

मैंने सोचा था कि मैं इस्तेमाल कर सकते हैं:

{ :controller => "permissions", :action => "show" } 

वास्तविक हैश कि वापस आता है:

ActionController::Routing::Routes.recognize_path "/permissions/1" 

की तरह एक हैश प्राप्त करने के लिए

{ :controller => "permissions", :action => "1" } 

मुझे सही कार्रवाई नाम कैसे प्राप्त होगा आईडी में बस मेरे पास की बजाय? प्रेषक इसे किसी भी तरह से प्राप्त करने में सक्षम होना चाहिए या रेल काम नहीं करेगा, लेकिन मुझे यह पता लगाने में परेशानी हो रही है कि यह कैसे पूरा किया जाता है।

उत्तर

2

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

मैंने मॉडल-आधारित प्राधिकरण के विपरीत मार्ग-आधारित प्राधिकरण का उपयोग करना चुना।

# 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 [: नियंत्रक] और request.params [: action] के साथ नियंत्रक और कार्रवाई तक पहुंचते हैं।

यदि कार्रवाईकंट्रोलर :: रूटिंग :: Routes.recognize_path ("/ अनुमतियां/1") ने सही कार्रवाई की है तो यह सब आवश्यक नहीं होगा।

11

आप वास्तव में क्या कर रहे हैं? क्या तुम सच में कार्य का नाम और नियंत्रक के नाम के बाद कर रहे हैं ... तुम सिर्फ पूछ सकते हैं के लिए

controller.controller_name 

और

controller.action_name 

कि मदद करता है, या आप वास्तव में एक स्ट्रिंग पार्स करने में क्या करना चाहिए यह?

+2

मैं जगह में मार्ग आधारित प्राधिकरण है । असल में, मेरे डेटाबेस में मैं नियंत्रकों और कार्यों में प्लग करता हूं जिन्हें मैं केवल कुछ उपयोगकर्ताओं के लिए सुलभ बनाना चाहता हूं और उन्हें अनुमति के रूप में मानता हूं। मैं भूमिकाओं में इन अनुमतियों को बंडल करता हूं और उन्हें अपने उपयोगकर्ताओं को असाइन करता हूं। जब एक संरक्षित पृष्ठ का दौरा किया जाता है, तो पहले फ़िल्टर निर्धारित करेगा कि उपयोगकर्ता को उस पृष्ठ पर रहने की अनुमति है या नहीं। यह बहुत अच्छा काम कर रहा है (आपके द्वारा सुझाए गए तरीकों का उपयोग करके)। अब मुझे लिंक के पीछे पृष्ठ पर जाने की अनुमति है या नहीं, इस पर आधारित एक लिंक को गतिशील रूप से प्रदर्शित करने की आवश्यकता है। मेरे पास लक्ष्य नियंत्रक तक पहुंच नहीं है, केवल पथ। –

10

विधि पथ पहचान करने के लिए 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"} 
+0

नोट, सिंटैक्स काम करता है अगर रेल कंसोल से बुलाया जाता है, लेकिन जब मैंने इसे एप्लिकेशन_कंट्रोलर से बुलाया, तो मुझे "एप" को हटाना पड़ा। "app.edit_somecontroller ..." भाग से। तो, उदाहरण के लिए: Rails.application.routes.recognize_path (users_path) – JosephK

संबंधित मुद्दे