2013-10-13 7 views
6

मेरे पास Events नियंत्रक है जिस पर मैं प्रामाणिकता को छोड़ना चाहता हूं, घटना घटना सार्वजनिक है।सशर्त रूप से skip_before_filter को लागू करें: if => रेल में स्थिति 4

मेरे ApplicationController मैं तैयार करने के authenticate_user!

class ApplicationController < ActionController::Base 
    before_action :authenticate_user! 
end 

अब, मेरे घटनाक्रम तालिका के अंदर, मैं एक बूलियन क्षेत्र public कहा जाता है इस फोन है। मैं यह जांचने के लिए उपयोग करता हूं कि घटना सार्वजनिक है या नहीं। EventsController

class EventsController < ApplicationController 
    skip_before_action :authenticate_user!, only: :show, if: Proc.new { :is_public? } 
end 

लेकिन किसी कारण से इस तरह, यह काम नहीं किया। तो मैं यह करने के लिए किया था:

class EventsController < ApplicationController 
    skip_before_action :authenticate_user!, only: :show 
    before_action :authenticate_user!, unless: :is_public? 

    def is_public? 
    @event.present? && @event.is_public 
    end 
end 

यह काम करता है के रूप में की उम्मीद है और प्रमाणीकरण अगर @event.public = true क्योंकि ऊपर लंघन के बाद उलटा शर्त के साथ before_filter दोहराता को छोड़ दें।

मैं सोच रहा हूँ:

  1. मैं क्या किया सही है?
  2. क्या इसका कोई प्रदर्शन प्रभाव पड़ता है। यदि हां, तो क्या कोई बेहतर तरीका है?
+1

कोड के दूसरे खंड में, आप उद्देश्य पर प्रश्न चिह्न भूल गए? 'Proc.new {: is_public}' – Damien

+0

नोप्स। मैं वास्तव में यह ': if => conditonal' काम नहीं कर सका, इसलिए सुनिश्चित नहीं है कि यह': is_pulic? 'या ': is_public' – CuriousMind

+0

यदि आपके पास' सार्वजनिक 'फ़ील्ड है, तो यह' सार्वजनिक 'या' सार्वजनिक? '। यदि आप इसका उपयोग करना चाहते हैं तो 'is_public?' विधि को अपने 'ईवेंट' मॉडल पर ले जाएं। – Damien

उत्तर

6

कॉलबैक (पहले, बाद में, कार्रवाई के आसपास) पर रेल दस्तावेज वास्तव में बहुत खराब है। यह समान प्रश्न देखें: skip_before_filter ignores conditionals

इसलिए मैं हमेशा रेल गाइड का संदर्भ देता हूं। वह हिस्सा जो आपके लिए दिलचस्प होगा यहां है: http://guides.rubyonrails.org/action_controller_overview.html#other-ways-to-use-filters

मुझे पूरी तरह से यकीन नहीं है कि यह स्किप फ़िल्टर के साथ भी काम करेगा, लेकिन यह एक कोशिश के लायक है।

अलग-अलग फ़िल्टरों को कॉल करके केवल प्रदर्शन प्रभाव नहीं होना चाहिए। प्रदर्शन मुद्दे आमतौर पर व्यापक डेटाबेस क्वेरी या अन्य बाहरी सिस्टम कॉल द्वारा आते हैं।

मेरी मुख्य चिंता यहाँ हो सकता है कि यह समझना महत्वपूर्ण है क्यों वहाँ इतने सारे before_action चल रहा बातें हैं बहुत मुश्किल है ...

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