2011-02-25 5 views
15

निम्नलिखित कोड के साथ:वहाँ रेल में एक तरह से एक before_filter छोड़ने की सुविधा अनुरोध XHR है है?

class TestsController < ApplicationController 
    skip_before_filter :load_something,  # how to skip these only 
        :load_something_else # if the request is xhr ? 

    def index 
    respond_to do |format| 
     format.html 
     format.js 
    end 
    end 

end 

वहाँ से पहले फिल्टर निर्भर करता है यदि अनुरोध :load_something और :load_something_else तरीकों को बदलने के बिना एक जावास्क्रिप्ट कॉल है छोड़ने के लिए कोई तरीका है?

धन्यवाद!

उत्तर

18

इस के लिए कोई साफ समाधान हुआ करता था। मान लें कि आप before_filters पर नियंत्रण की जरूरत नहीं है (या उन्हें बदलने के लिए नहीं करना चाहते हैं), मैं skip_before_filter छोड़ने के लिए और एक अतिरिक्त before_filter कि केवल वांछित तरीकों को निष्पादित करता है, तो यह एक xhr विधि है जोड़ना होगा।

तो जैसे

skip_before_filter :load_something,  # how to skip these only 
        :load_something_else # if the request is xhr ? 
before_filter :do_loads_if_xhr 

def do_loads_if_xhr 
    if request.xhr? 
    load_something 
    load_something_else 
    end 
end 

विधि वर्णित here कुछ ही काम करता है क्योंकि सशर्त आवेदन के लिए वैश्विक है: सशर्त केवल मूल्यांकन किया जाता है जब वर्ग बनाया जाता है। प्रत्येक अनुरोध पर नहीं।

[अद्यतन] हालांकि, skip_before_filter सशर्त बनाने के लिए एक क्लीनर तरीका है। इसे इस तरह लिखें:

skip_before_filter :load_something, :load_something_else, :if => proc {|c| request.xhr?} 

इसके अलावा, ध्यान दें कि skip_before_filter अब भी है, जबकि पूरी तरह से समर्थित है, और नहीं पदावनत के बाद से रेल 4 प्रलेखन (समान) skip_before_action पसंद करने लगता है। इसके अलावा दस्तावेज़ इस बारे में बिल्कुल स्पष्ट नहीं है, कोड में सत्यापित करना था।

3

आपको लगता है कि फिल्टर कोडित? उस मामले में आप skip_before_filter का उपयोग किए बिना उन्हें अंदर एक if खंड लिख सकते हैं: मुझे लगता है कि यह काम करना चाहिए

before_filter :my_own_filter 

def my_own_filter 
    unless request.xhr? 
    load_something 
    load_something_else 
    end 
end 

:

def load_something 
    unless request.xhr? 
    #Code 
    end 
end 

दूसरी ओर में, आप yout खुद फिल्टर और प्रतिनिधि बना सकते हैं।

+0

विधियों को एक साथ नहीं होना चाहिए ताकि अगर कोई पिछला लौटता है तो अन्य नहीं चलेंगे और फ़िल्टर श्रृंखला रुक जाएगी? –

4

उपयोग alias_method_chain फिल्टर को सजाने के लिए है, इसलिए वे क्रियान्वित नहीं कर रहे हैं अनुरोध XHR है।

def load_something_with_noxhr(*args) 
    load_something_without_noxhr(*args) unless request.xhr? 
end 

alias_method_chain :load_something, :noxhr 

(जो कुछ भी जरूरत में load_something बदलने के लिए, _with_ और _without_ शाब्दिक हैं, और प्रत्यय noxhr ही आप alias_method_chain कॉल में दूसरा तर्क के रूप में पारित किया जाना चाहिए।)

+0

ऐसा लगता है कि 'alias_method_chain' को बहिष्कृत/अनुशंसित नहीं किया जा सकता है http://stackoverflow.com/questions/3689736/rails-3-alias-method-chain-still-used – colllin

+1

यह नहीं कि इसकी अनुशंसा नहीं की जाती है, लेकिन अब (रूबी 2.1) marvellos 'प्रीपेन्ड MyModule' है जो आपके मॉड्यूल को कॉल चेन का _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _" – rewritten

37

छोड़ने के लिए इसे लाइन का प्रयास करें एक शर्त के आधार पर फ़िल्टर:

skip_before_filter :load_something, :load_something_else, 
    :if => proc { request.xhr? } 

आप भी lambdas (जो तर्क गुजर में एक कठोरता है) का उपयोग कर सकते के लिए:

skip_before_filter :load_something, :load_something_else, 
    if: -> { request.xhr? } 

या एक तर्क के साथ:

skip_before_filter :load_something, :load_something_else, 
    if: ->(arg) { request.xhr? && arg } 
9

इन सभी उत्तर मेरी राय में गलत तरीका अपनाने।एक शर्त के साथ skip_before_action का उपयोग करना इसे पीछे की तरफ कर रहा है, और पहले से ही स्थिति को जोड़ने के रूप में स्पष्ट और स्पष्ट नहीं है; उन्हें नियंत्रक में कहीं इस skip_before_action भर में हो पर भरोसा करने के बिना यह क्या स्थिति यह before_action रन के तहत तुरंत स्पष्ट है या नहीं चलता है अपने कोड को पढ़ने, किसी को

before_action :require_password_change, unless: -> { request.xhr? } 

इस तरह,: तो यह मेरे प्रस्ताव है पदानुक्रम।

+0

यह मैंने देखा है सबसे अच्छा तरीका है –

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