attr_accessible
tampaknya tidak lagi berfungsi dalam model saya.
Apa cara untuk memungkinkan penugasan massal di Rails 4?
attr_accessible
tampaknya tidak lagi berfungsi dalam model saya.
Apa cara untuk memungkinkan penugasan massal di Rails 4?
Jawaban:
Rails 4 sekarang menggunakan parameter kuat .
Melindungi atribut sekarang dilakukan di controller. Ini adalah sebuah contoh:
class PeopleController < ApplicationController
def create
Person.create(person_params)
end
private
def person_params
params.require(:person).permit(:name, :age)
end
end
Tidak perlu diatur attr_accessible
dalam model lagi.
accepts_nested_attributes_for
Untuk menggunakan accepts_nested_attribute_for
dengan parameter yang kuat, Anda harus menentukan atribut bersarang mana yang masuk daftar putih.
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
Kata kunci cukup jelas, tetapi untuk berjaga-jaga, Anda dapat menemukan informasi lebih lanjut tentang parameter kuat dalam panduan Pengendali Tindakan Rails .
Catatan : Jika Anda masih ingin menggunakan attr_accessible
, Anda harus menambahkan protected_attributes
ke Gemfile
. Jika tidak, Anda akan dihadapkan dengan 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.
Jika Anda lebih suka attr_accessible, Anda bisa menggunakannya di Rails 4 juga. Anda harus menginstalnya seperti permata:
gem 'protected_attributes'
setelah itu Anda bisa menggunakan attr_accessible di model Anda seperti di Rails 3
Juga, dan saya pikir itu adalah cara terbaik - menggunakan objek formulir untuk berurusan dengan penugasan massal, dan menyimpan objek bersarang, dan Anda juga dapat menggunakan permata protected_attributes dengan cara itu
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
Kita bisa menggunakan
params.require(:person).permit(:name, :age)
di mana orang adalah Model, Anda dapat meneruskan kode ini pada metode person_params & digunakan sebagai ganti params [: orang] dalam membuat metode atau metode lain
Pembaruan untuk Rails 5:
gem 'protected_attributes'
sepertinya tidak berfungsi lagi. Tapi berikan:
permata 'protected_attributes_continued'
mencoba.
1) Perbarui Rencanakan agar dapat menangani Rails 4.0 dengan menambahkan baris ini ke Gemfile aplikasi Anda:
gem 'devise', '3.0.0.rc'
Kemudian jalankan:
$ bundle
2) Tambahkan fungsi lama attr_accessible
lagi ke rel 4.0
Coba gunakan attr_accessible
dan jangan berkomentar.
Tambahkan baris ini ke Gemfile aplikasi Anda:
gem 'protected_attributes'
Kemudian jalankan:
$ bundle
attr_accessible
perlu dihapus. Apa yang akan terjadi jika kita menyimpannya?