कुछ देखने के बाद, मैं नहीं एक एक लाइनर मॉडल में यह हो मदद करने के लिए मिल सकता है। अब तक, रेल Enums प्रदान करता है, लेकिन अमान्य मान मान्य करने के लिए एक व्यापक तरीका नहीं है।
इसलिए, मैंने एक समग्र समाधान का चयन किया: strong_params
सेट करने से पहले, और फिर मॉडल के विरुद्ध जांच करके नियंत्रक में एक सत्यापन जोड़ने के लिए।
में भाग लेने:
तो, मॉडल में, मैं एक विशेषता और एक कस्टम सत्यापन पैदा करेगा।rb
enum :status => { your set of values }
attr_accessor :invalid_status
validate :valid_status
#...
private
def valid_status
if self.invalid_status == true
errors.add(:status, "is not valid")
end
end
इसके अलावा, मैं अमान्य इनपुट के लिए मानकों के खिलाफ एक जांच करेंगे और (यदि आवश्यक हो) मॉडल के लिए परिणाम भेजने के लिए, तो एक त्रुटि वस्तु में जोड़ दिया जाएगा, इस प्रकार यह अवैध
बनाने
attends_controller.rb
private
def attend_params
#modify strong_params to include the additional check
if params[:attend][:status].in?(Attend.statuses.keys << nil) # to also allow nil input
# Leave this as it was before the check
params.require(:attend).permit(....)
else
params[:attend][:invalid_status] = true
# remove the 'status' attribute to avoid the exception and
# inject the attribute to the params to force invalid instance
params.require(:attend).permit(...., :invalid_status)
end
end
स्रोत
2017-10-02 11:10:43
म्यू और माइक के जवाब अच्छे हैं - यह भी http://stackoverflow.com/q/265725/887124 देखते हैं, जो देता है एक समान प्रश्न के कुछ अलग जवाब। –
हाँ, मैं वास्तव में समाधान बॉब द्वारा प्रदान किए गए कुछ और समान उपयोग करता हूं: [gist] (https://gist.github.com/1372650) – mnelson