रेल 4 में attr_accessible का उपयोग कैसे किया जाता है?


258

attr_accessible लगता है अब मेरे मॉडल के भीतर काम नहीं करेगा।

रेल 4 में बड़े पैमाने पर असाइनमेंट की अनुमति देने का तरीका क्या है?

जवाबों:


447

रेल 4 अब मजबूत मापदंडों का उपयोग करता है ।

नियंत्रक में अब प्रोटेक्टिंग विशेषताएँ की जाती हैं। यह एक उदाहरण है:

class PeopleController < ApplicationController
  def create
    Person.create(person_params)
  end

  private

  def person_params
    params.require(:person).permit(:name, :age)
  end
end

attr_accessibleअब मॉडल में सेट करने की आवश्यकता नहीं है।

साथ बर्ताव करना accepts_nested_attributes_for

accepts_nested_attribute_forमजबूत मापदंडों के साथ उपयोग करने के लिए , आपको यह निर्दिष्ट करने की आवश्यकता होगी कि कौन से नेस्टेड विशेषताओं को श्वेत सूची में होना चाहिए।

class Person
  has_many :pets
  accepts_nested_attributes_for :pets
end

class PeopleController < ApplicationController
  def create
    Person.create(person_params)
  end

  # ...

  private

  def person_params
    params.require(:person).permit(:name, :age, pets_attributes: [:name, :category])
  end
end

कीवर्ड आत्म-व्याख्यात्मक हैं, लेकिन बस मामले में, आप रेल एक्शन कंट्रोलर गाइड में मजबूत मापदंडों के बारे में अधिक जानकारी पा सकते हैं ।

नोट : यदि आप अभी भी उपयोग करना चाहते हैं attr_accessible, तो आपको protected_attributesअपने साथ जोड़ना होगा Gemfile। अन्यथा, आप एक के साथ सामना किया जाएगा RuntimeError


1
दस्तावेज़ ने यह नहीं कहा कि attr_accessibleहटाने की आवश्यकता है। अगर हम इसे रखेंगे तो क्या होगा?
लुलला

12
यदि आप अपने Gemfile में कुछ समायोजन नहीं करते हैं, तो आपको एक त्रुटि मिलेगी। RuntimeError in MicropostsController#index 'attr_accessible' is extracted out of Rails into a gem. Please use new recommended protection model for params(strong_parameters) or add 'protected_attributes' to your Gemfile to use old one.
उपयोगकर्ता

6
महान व्याख्या। यह व्यवहार में ऐसा लगता है, हालांकि, यह मोटा मॉडल, पतले नियंत्रक आदि से दूर चलता है, और पतले मॉडल की ओर बढ़ता है, और वास्तव में नियंत्रकों की तरह चलता है। आपको यह सब सामान हर उदाहरण के लिए लिखना होगा, यह अच्छी तरह से नहीं पढ़ा जाता है, और घोंसला बनाने के लिए दर्द होता है। मॉडल प्रणाली में पुराने attr_accessible / attr_accessor को तोड़ा नहीं गया था, और इसे ठीक करने की आवश्यकता नहीं थी। एक ब्लॉग पोस्ट इस मामले में बहुत लोकप्रिय हुई।
आरसीडी

1
आपको अपने नियंत्रकों में अनुमत मापदंडों को संभालने की आवश्यकता नहीं है। वास्तव में यह एकल जिम्मेदारी सिद्धांत का उल्लंघन है। निम्नलिखित ब्लॉग पोस्ट पर एक नज़र डालें edelpero.svbtle.com/strong-parameters-the-right-way
पियरे-लुइस गोटफ्रॉइस

3
तो नौटंकी और अक्सर बदलते एपिस, न्यूफ़ाउंड पेडेंटिक्स के साथ मिलकर कई डेवलपर घंटे बर्बाद करते हैं, फिर भी एक और दर्दनाक रेल अपग्रेड होता है :-(
ब्रायन तकिटा

22

यदि आप attr_accessible पसंद करते हैं, तो आप इसका उपयोग रेल 4 में भी कर सकते हैं। आपको इसे मणि की तरह स्थापित करना चाहिए:

gem 'protected_attributes'

उसके बाद आप Rr 3 में अपने जैसे मॉडलों में attr_accessible का उपयोग कर सकते हैं

इसके अलावा, और मुझे लगता है कि यह सबसे अच्छा तरीका है- बड़े पैमाने पर असाइनमेंट से निपटने के लिए फॉर्म ऑब्जेक्ट्स का उपयोग करना, और नेस्टेड ऑब्जेक्ट्स को सहेजना, और आप उस तरह से संरक्षित_एट्रेक्ट रत्न का उपयोग भी कर सकते हैं।

class NestedForm
   include  ActiveModel::MassAssignmentSecurity
   attr_accessible :name,
                   :telephone, as: :create_params
   def create_objects(params)
      SomeModel.new(sanitized_params(params, :create_params))
   end
end

1
जब आप 'मजबूत मापदंडों' का उपयोग करते हैं तो आप नियंत्रक परत में मापदंडों को फ़िल्टर करते हैं, और मुझे नहीं लगता कि यह सभी अनुप्रयोगों के लिए सबसे अच्छा विचार है। मेरे लिए मापदंडों को फ़िल्टर करने का सबसे अच्छा तरीका अतिरिक्त परत का उपयोग करना है। और हम इस लेयर को लिखने के लिए '
protect_attributes

4

हम प्रयोग कर सकते हैं

params.require(:person).permit(:name, :age)

जहां व्यक्ति मॉडल है, आप इस कोड को एक विधि person_params पर पारित कर सकते हैं और params के स्थान पर उपयोग कर सकते हैं: [व्यक्ति] बनाने की विधि या किसी अन्य विधि में


2

रेल 5 के लिए एक अपडेट:

gem 'protected_attributes' 

अब काम नहीं लगता। लेकिन दे:

मणि 'protect_attributes_continued'

एक कोशिश।


1

1) अपडेट अपडेट करें ताकि यह आपके एप्लिकेशन के Gemfile में इस लाइन को जोड़कर रेल 4.0 को हैंडल कर सके:

gem 'devise', '3.0.0.rc' 

फिर निष्पादित करें:

$ bundle

2) attr_accessibleरेल की फिर से पुरानी कार्यक्षमता जोड़ें 4.0

उपयोग करने की कोशिश करें attr_accessibleऔर इस पर टिप्पणी न करें।

इस लाइन को अपने एप्लिकेशन के जेमफाइल में जोड़ें:

gem 'protected_attributes'

फिर निष्पादित करें:

$ bundle
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.