पहले_फिल्टर मापदंडों के साथ


84

मेरे पास एक तरीका है जो इस तरह से कुछ करता है:

before_filter :authenticate_rights, :only => [:show]

def authenticate_rights
  project = Project.find(params[:id])
  redirect_to signin_path unless project.hidden
end

मैं कुछ अन्य नियंत्रकों में भी इस पद्धति का उपयोग करना चाहता हूं, इसलिए मैंने इस विधि को एक सहायक को कॉपी किया जो कि application_controller में शामिल है।

समस्या यह है कि कुछ नियंत्रकों में, परियोजना के लिए आईडी :idप्रतीक नहीं है, लेकिन फ़े :project_id(और यह भी :idमौजूद है (दूसरे मॉडल के लिए)

आप इस समस्या को कैसे हल करेंगे? क्या पहले_फिल्टर एक्शन (सही पैराम को पास करने के लिए) पैरामीटर जोड़ने का विकल्प है?

जवाबों:


86

मैं इसे इस तरह से करूँगा:

before_filter { |c| c.authenticate_rights correct_id_here }

def authenticate_rights(project_id)
  project = Project.find(project_id)
  redirect_to signin_path unless project.hidden
end

कहाँ correct_id_hereपहुँच एक के लिए प्रासंगिक आईडी है Project


2
क्या कोई ,:only => [:show]प्रतीक जोड़ने का कोई तरीका है ? मैं कोशिश कर रहा एक त्रुटि हो रही हैbefore_filter { |c| c.authenticate_rights correct_id_here }, :only => [:show]
choise

27
दूसरी तरह के आसपास का प्रयास करें: before_filter(:only => [:show]) { <block_code_here> }। यहाँ और अधिक उदाहरण: apidock.com/rails/ActionController/Filters/ClassMethods/…
fguillen

1
यदि आप before_filterएक निजी विधि बनाकर इसे सुरक्षित करते हैं , तो शायद री-फैक्टर (उदाहरण के लिए इसे पैरेंट कंट्रोलर, एप्लिकेशनकंट्रोलर आदि के पास ले जाएं), आपको उपयोग करने की आवश्यकता होगी c.send(:filter_name, ...)क्योंकि फ़िल्टर कंट्रोलर संदर्भ में नहीं चलेगा। guide.rubyonrails.org/…
रिचर्ड माइकल

2
ऐसा करने से ऐसा हो जाता है, इसलिए पहले_फिल्टर को नाम (खरीद) की कमी के कारण ओवरराइड / स्किप नहीं किया जा सकता है। मैं जिन मूल्यों को पास करना चाहता हूं वे कक्षा स्तर के हैं। क्या यह संभव है?
अजवायन

1
@oreoshake: मैं एक ही समस्या है। क्या आपको कोई हल मिला?
marcus3006

67

कुछ कृत्रिम चीनी के साथ:

before_filter -> { find_campaign params[:id] }, only: [:show, :edit, :update, :destroy]

या यदि आप और भी अधिक फैंसी पाने का फैसला करते हैं:

before_filter ->(param=params[:id]) { find_campaign param }, only: %i|show edit update destroy|

और चूंकि रेल 4 before_action, एक पर्यायवाची के रूप before_filterमें प्रस्तुत की गई थी, इसलिए इसे इस प्रकार लिखा जा सकता है:

before_action ->(param=params[:id]) { find_campaign param }, only: %i|show edit update destroy|

एनबी

->लैम्ब्डा शाब्दिक के लिए खड़ा है lambda, रूबी 1.9 में परिचय

%i प्रतीकों की एक सरणी बनाएगा


5
यह उत्तर अधिक सुरुचिपूर्ण है क्योंकि लैम्ब्डा कक्षा के निष्पादन के संदर्भ में चूकता है, इसलिए निजी तरीकों को '.send' का उपयोग किए बिना कहा जा सकता है
डेविड

@Vadym Tyemirov find_campaignनिजी विधि का नाम है? में param=params[:id], paramनए स्थानीय चर का नाम है जिसे तर्क के रूप में पारित किया जाएगा find_campaign? मतलब, find_campaignनिजी पद्धति के भीतर , हम उपयोग paramनहीं करते हैं params{:id],?
एहनबिजद

1
find_campaignया तो हो सकता है, लेकिन मैं यह सुनिश्चित करने के लिए निजी बनाऊंगा कि हम उपभोग नहीं किया जाता है। paramsहमारे तरीकों के लिए एक हैश वैरिएबल उपलब्ध है, paramकोई भी वैरिएबल है जिसे आपको find_campaign मेथड के लिए पास करना होगा, जैसेbefore_action ->(campaign_id=params[:id]) { find_campaign(campaign_id) }, only: %i| show edit update destroy |
वडीम टायमिरोव

14

@Alex 'उत्तर को जारी रखने के लिए, यदि आप :exceptया :onlyकुछ विधियों को यहाँ करना चाहते हैं, तो यहाँ वाक्यविन्यास है:

before_filter :only => [:edit, :update, :destroy] do |c| c.authenticate_rights params[:id] end 

यहां मिला ।


5

मैं do...endस्पष्ट विकल्प के बजाय घुंघराले ब्रेसिज़ का उपयोग करके ब्लॉक विधि ढूंढता हूं

before_action(only: [:show]) { authenticate_rights(id) }

before_action के लिए सिर्फ नया पसंदीदा वाक्यविन्यास है before_filter


-1

यह काम करना चाहिए:

project = Project.find(params[:project_id] || params[:id])

यह वापस आ जाएगी params[:project_id]अगर यह पैरामीटर हैश में मौजूद है, या वापसी params[:id]अगर यह नहीं है।


समस्या यह है कि कभी-कभी दोनों मौजूद होते हैं (नेस्टेड) ​​और यह एक ऐसी परियोजना को ढूंढता है जो सही नहीं है।
choise

@ गूंज: ऐसा नहीं होना चाहिए: अगर project_idमौजूद है तो यह orसुनिश्चित करेगा कि इसका उपयोग किया जाता है - केवल अगर project_idआपूर्ति नहीं की जाती है तो idपरम का चयन किया जाएगा। दूसरे शब्दों में: जब दोनों मापदंडों की आपूर्ति की जाती है, तो orक्लॉज सुनिश्चित करता है कि सही मूल्य का उपयोग किया जाए, क्योंकि यह हमेशा पसंद करेगा project_id। स्वाभाविक रूप से, आप इस पद्धति को कॉल नहीं करना चाहेंगे जब न तो मौजूद है, या जब कोई नहीं है, project_idलेकिन एक ऐसा है idजो एक परियोजना का संदर्भ नहीं देता है।
ओला तुवेसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.