attr_accessible
ดูเหมือนว่าจะไม่ทำงานในรุ่นของฉันอีกต่อไป
วิธีการอนุญาตให้ใช้งานการมอบหมายจำนวนมากใน Rails 4 คืออะไร
attr_accessible
ดูเหมือนว่าจะไม่ทำงานในรุ่นของฉันอีกต่อไป
วิธีการอนุญาตให้ใช้งานการมอบหมายจำนวนมากใน Rails 4 คืออะไร
คำตอบ:
ราง 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
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.
ถ้าคุณชอบ 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
เราสามารถใช้
params.require(:person).permit(:name, :age)
โดยที่ person คือ Model คุณสามารถส่งรหัสนี้ในเมธอด person_params และใช้แทน params [: person] ใน method method หรือ method อื่น
การอัพเดทสำหรับ Rails 5:
gem 'protected_attributes'
ดูเหมือนจะไม่ทำงานอีกต่อไป แต่ให้:
gem 'protected_attributes_continued'
ลอง.
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
attr_accessible
ต้องลบออก จะเกิดอะไรขึ้นถ้าเราเก็บมันไว้?