Bagaimana attr_accessible digunakan di Rails 4?

258

attr_accessible tampaknya tidak lagi berfungsi dalam model saya.

Apa cara untuk memungkinkan penugasan massal di Rails 4?

pengguna2532974
sumber

Jawaban:

447

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_accessibledalam model lagi.

Berurusan dengan accepts_nested_attributes_for

Untuk menggunakan accepts_nested_attribute_fordengan 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_attributeske Gemfile. Jika tidak, Anda akan dihadapkan dengan RuntimeError.

Pierre-Louis Gottfrois
sumber
1
Dokumen itu tidak mengatakan itu attr_accessibleperlu dihapus. Apa yang akan terjadi jika kita menyimpannya?
lulalala
12
Anda akan mendapatkan kesalahan jika Anda tidak membuat beberapa penyesuaian pada Gemfile Anda. 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.
pengguna
6
Penjelasan yang bagus. Sepertinya dalam praktiknya, bagaimanapun, ini memindahkan Rails dari model gemuk, pengontrol tipis, dll, dan menuju model tipis, dan pengontrol yang benar-benar membengkak. Anda harus menulis semua hal ini untuk setiap contoh, itu tidak dapat dibaca dengan baik, dan bersarang tampaknya menyusahkan. Attr_accessible / attr_accessor lama dalam sistem model tidak rusak, dan tidak perlu diperbaiki. Satu posting blog menjadi terlalu populer dalam hal ini.
rcd
1
Anda tidak harus menangani parameter yang diizinkan di controller Anda. Bahkan itu merupakan pelanggaran prinsip tanggung jawab tunggal. Lihatlah posting blog berikut edelpero.svbtle.com/strong-parameters-the-right-way
Pierre-Louis Gottfrois
3
Apik begitu menarik perhatian & sering berganti, ditambah dengan pedantik yang baru ditemukan menghabiskan banyak waktu pengembang dalam peningkatan Rails yang menyakitkan :-(
Brian Takita
22

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
edikgat
sumber
1
Ketika Anda menggunakan 'parameter kuat', Anda memfilter parameter di lapisan pengontrol, dan saya tidak berpikir bahwa ini adalah ide terbaik untuk semua aplikasi. Bagi saya cara terbaik untuk menyaring parameter adalah dengan menggunakan lapisan tambahan. Dan kita dapat menggunakan permata 'protected_attributes' untuk menulis layer ini
edikgat
4

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

Hardik Hardiya
sumber
2

Pembaruan untuk Rails 5:

gem 'protected_attributes' 

sepertinya tidak berfungsi lagi. Tapi berikan:

permata 'protected_attributes_continued'

mencoba.

miklki14567
sumber
1

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_accessiblelagi ke rel 4.0

Coba gunakan attr_accessibledan jangan berkomentar.

Tambahkan baris ini ke Gemfile aplikasi Anda:

gem 'protected_attributes'

Kemudian jalankan:

$ bundle
Sid
sumber