ruby on rails - एक ऐसी स्थिति का सामना करते समय रेल 4 में निषिद्ध गुण त्रुटि जब किसी ने रेल के पुराने संस्करणों में attr_accessible का उपयोग किया होता




ruby-on-rails ruby-on-rails-4 (4)

नियंत्रक कार्रवाई में अपनी नई user_params विधि जोड़ने के लिए मत भूलना:

  def create
    @user = User.new(user_params)

    @user.save
    redirect_to 'wherever'
  end

रेल 4 के हालिया अपग्रेड के साथ, नीचे दिए गए कोड का उपयोग करके विशेषताओं को अद्यतन करना काम नहीं करता है, मुझे एक सक्रिय ActiveModel::ForbiddenAttributes प्राप्त होता है ActiveModel::ForbiddenAttributes त्रुटि:

@user.update_attributes(params[:user], :as => :admin)

जहां उपयोगकर्ता के पास मॉडल में निम्न attr_accessible लाइन है:

attr_accessible :role_ids, :as =>admin
# or any attribute other than :role_ids contained within :user

आप रेल 4 में एक ही कार्य कैसे पूरा करते हैं?


यदि आप एक नई रेल 4 साइट बनाते हैं तो आप देखेंगे कि जनरेटेड नियंत्रकों में अब एक निजी विधि शामिल है जिसका उपयोग आप अपने sanitized पैरा प्राप्त करने के लिए करते हैं। यह एक अच्छा मुहावरे है, और ऐसा कुछ दिखता है:

private

  def user_params
    params.require(:user).permit(:username, :email, :password)
  end

सामूहिक असाइनमेंट की अनुमति देने का पुराना तरीका कुछ ऐसा उपयोग करना था:

attr_accessible :username, :email, :password

कुछ मापदंडों को सुलभ के रूप में चिह्नित करने के लिए आपके मॉडल पर।

उन्नयन

अपग्रेड करने के लिए आपके पास कई विकल्प हैं। आपका सबसे अच्छा समाधान पैरामीटर विधि के साथ अपने नियंत्रकों को दोबारा करने के लिए होगा। यद्यपि आपके पास अभी समय के मुकाबले ज्यादा काम हो सकता है।

Protected_attributes मणि

विकल्प संरक्षित_एट्रिब्यूट मणि का उपयोग करना होगा जो attr_accessible विधि को पुनर्स्थापित करता है। यह एक प्रमुख चेतावनी के साथ थोड़ा आसान अपग्रेड पथ बनाता है।

मेजर कैविट

रेल 3 में किसी भी मॉडल को attr_accessible कॉल के बिना हालांकि सभी विशेषताओं की अनुमति है।

संरक्षित_attributes मणि के साथ रेल 4 में इस व्यवहार को उलट दिया गया है। एक attr_accessible कॉल के बिना किसी भी मॉडल में सभी विशेषताओं को प्रतिबंधित किया गया है। अब आपको अपने सभी मॉडलों पर attr_accessible घोषित करना होगा। इसका अर्थ यह है कि, यदि आप attr_accessible का उपयोग नहीं कर रहे हैं, तो आपको इसे अपने सभी मॉडलों में जोड़ना होगा, जो कि पैराम विधि बनाने के रूप में उतना ही काम हो सकता है।

https://github.com/rails/protected_attributes


रेल 4 में अब डिफ़ॉल्ट रूप से निर्मित strong_parameters मणि की विशेषताएं हैं।

अब किसी को कॉल करना नहीं है :as => :admin , और न ही आपको attr_accessible :user_attribute, :as => admin आवश्यकता है attr_accessible :user_attribute, :as => admin आपके मॉडल में। इसका कारण यह है कि, डिफ़ॉल्ट रूप से, रेल अनुप्रयोगों में अब मॉडल पर प्रत्येक विशेषता के लिए 'सुरक्षा' है। आपको उस विशेषता को permit देना है जिसे आप एक्सेस / संशोधित करना चाहते हैं।

update_attributes दौरान अब आपको कॉल permit आवश्यकता है:

@user.update_attributes(params[:user], permit[:user_attribute]

या, अधिक सटीक होने के लिए:

@user.update_attributes(params[:user].permit(:role_ids))

हालांकि, यह एकल पंक्ति किसी भी उपयोगकर्ता को permit टेड भूमिका को संशोधित करने की permit । आपको किसी अन्य फ़िल्टर के माध्यम से किसी व्यवस्थापक या किसी अन्य वांछित भूमिका द्वारा इस क्रिया तक पहुंच की अनुमति देना याद रखना होगा:

authorize! :update, @user, :message => 'Not authorized as an administrator.'

। । । अगर आप प्रमाणीकरण और प्रमाणीकरण के लिए डेविस और कैनकन का उपयोग कर रहे हैं तो काम करेगा।


def create
  @user = User.create(user_params)
  ....
end

def update
  @user = User.find(params[:id])
  if @user.update_attributes(blog_params)
    redirect_to home_path, notice:  "Your profile has been successfully updated."
  else
    render action: "edit"
  end
end

private
  def user_params
    params.require(:user).permit(:name, :age, :others)
  end