มีการใช้ attr_accessible ใน Rails 4 อย่างไร


258

attr_accessible ดูเหมือนว่าจะไม่ทำงานในรุ่นของฉันอีกต่อไป

วิธีการอนุญาตให้ใช้งานการมอบหมายจำนวนมากใน Rails 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 มิฉะนั้นคุณจะต้องเผชิญกับGemfileRuntimeError


1
เอกสารไม่ได้บอกว่าattr_accessibleต้องลบออก จะเกิดอะไรขึ้นถ้าเราเก็บมันไว้?
lulalala

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
คำอธิบายที่ดี ดูเหมือนว่าในทางปฏิบัติแล้วสิ่งนี้จะย้าย Rails ออกจากโมเดลไขมันตัวควบคุมแบบบางและอื่น ๆ รวมถึงตัวแบบบางและตัวควบคุมที่ป่องจริง ๆ คุณต้องเขียนทุกอย่างนี้ทุกครั้งมันอ่านไม่ออกและการทำรังดูเหมือนจะเจ็บปวด ตัวเก่า attr_accessible / attr_accessor ในระบบรุ่นไม่พังและไม่จำเป็นต้องได้รับการแก้ไข หนึ่งโพสต์บล็อกได้รับความนิยมมากเกินไปในกรณีนี้
rcd

1
คุณไม่ต้องจัดการกับพารามิเตอร์ที่ได้รับอนุญาตในตัวควบคุมของคุณ ในความเป็นจริงมันเป็นการละเมิดหลักการความรับผิดชอบเดียว ดูโพสต์บล็อกต่อไปนี้edelpero.svbtle.com/strong-parameters-the-right-way
Pierre-Louis Gottfrois

3
ดังนั้นลูกเล่นและการเปลี่ยน apis บ่อยๆควบคู่ไปกับ pedantics ที่เพิ่งค้นพบใหม่ทำให้เสียเวลาหลายชั่วโมงสำหรับนักพัฒนาในการอัพเกรด Rails อันแสนเจ็บปวดอีกครั้ง :-(
Brian Takita

22

ถ้าคุณชอบ attr_accessible คุณสามารถใช้มันใน Rails 4 ได้เช่นกัน คุณควรติดตั้งเหมือนพลอย:

gem 'protected_attributes'

หลังจากนั้นคุณสามารถใช้ attr_accessible ในแบบจำลองของคุณเช่นใน Rails 3

นอกจากนี้และฉันคิดว่านั่นเป็นวิธีที่ดีที่สุด - ใช้แบบฟอร์มวัตถุเพื่อจัดการกับการมอบหมายจำนวนมากและบันทึกวัตถุที่ซ้อนกันและคุณยังสามารถใช้ gem

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
เมื่อคุณใช้ 'พารามิเตอร์ที่แข็งแกร่ง' คุณจะกรองพารามิเตอร์ในเลเยอร์คอนโทรลเลอร์และฉันไม่คิดว่านี่เป็นแนวคิดที่ดีที่สุดสำหรับแอปพลิเคชันทั้งหมด สำหรับฉันวิธีที่ดีที่สุดในการกรองพารามิเตอร์คือการใช้เลเยอร์เพิ่มเติม และเราสามารถใช้ gem 'protected_attributes' เพื่อเขียนเลเยอร์นี้
edikgat

4

เราสามารถใช้

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

โดยที่ person คือ Model คุณสามารถส่งรหัสนี้ในเมธอด person_params และใช้แทน params [: person] ใน method method หรือ method อื่น


2

การอัพเดทสำหรับ Rails 5:

gem 'protected_attributes' 

ดูเหมือนจะไม่ทำงานอีกต่อไป แต่ให้:

gem 'protected_attributes_continued'

ลอง.


1

1) อัปเดตอุปกรณ์เพื่อให้สามารถรองรับ Rails 4.0 ได้โดยเพิ่มบรรทัดนี้ใน Gemfile ของแอปพลิเคชันของคุณ:

gem 'devise', '3.0.0.rc' 

จากนั้นดำเนินการ:

$ bundle

2) เพิ่มฟังก์ชั่นเก่าของattr_accessibleอีกครั้งใน Rails 4.0

ลองใช้attr_accessibleและอย่าคอมเม้นต์นี้

เพิ่มบรรทัดนี้ใน Gemfile ของแอปพลิเคชันของคุณ:

gem 'protected_attributes'

จากนั้นดำเนินการ:

$ bundle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.