Dalam Rails, apa perbedaan antara attr_accessor
dan attr_accessible
? Dari pemahaman saya, menggunakan attr_accessor
digunakan untuk membuat metode pengambil dan penyetel untuk variabel itu, sehingga kita dapat mengakses variabel seperti Object.variable
atau Object.variable = some_value
.
Saya membaca yang attr_accessible
membuat variabel tertentu dapat diakses oleh dunia luar. Dapatkah seseorang tolong katakan padaku apa bedanya
ruby-on-rails
ruby
felix
sumber
sumber
attr_accessor
digunakan untuk menghasilkan metode pengambil dan penyetel. Silakan lihat jawaban saya untuk pertanyaan sebelumnya untuk penjelasan yang cukup komprehensif tentangattr_accessible
: stackoverflow.com/questions/2652907/… kemudian perbarui pertanyaan Anda jika Anda memerlukan detail spesifik lainnya setelah itu.Jawaban:
attr_accessor
adalah metode Ruby yang membuat pengambil dan penyetel.attr_accessible
adalah metode Rails yang memungkinkan Anda untuk mengirimkan nilai ke penugasan massal:new(attrs)
atauupdate_attributes(attrs)
.Inilah tugas massal:
Anda dapat membayangkan bahwa pesanan tersebut mungkin juga memiliki kode diskon, katakanlah
:price_off
. Jika Anda tidak memberi tag:price_off
saatattr_accessible
Anda menghentikan kode jahat agar dapat melakukannya seperti itu:Bahkan jika formulir Anda tidak memiliki bidang untuk
:price_off
, jika dalam model Anda itu tersedia secara default. Ini berarti POST buatan masih bisa mengaturnya. Menggunakanattr_accessible
daftar putih hal-hal yang dapat ditugaskan secara massal.sumber
attr_accessible
dalam dokumentasi Rails? api.rubyonrails.orgattr_accessible
edgeguides.rubyonrails.org/...Banyak orang di utas ini dan di Google menjelaskan dengan sangat baik yang
attr_accessible
menentukan daftar putih atribut yang diizinkan untuk diperbarui secara massal ( semua atribut dari suatu model objek bersamaan pada saat yang sama ) Ini terutama (dan hanya) untuk melindungi aplikasi Anda dari eksploitasi bajak laut "penugasan massal".Ini dijelaskan di sini di dokumen resmi Rails: Mass Assignment
attr_accessor
adalah kode ruby untuk (dengan cepat) membuat metode setter dan pengambil dalam suatu Class. Itu saja.Sekarang, apa yang hilang sebagai penjelasan adalah bahwa ketika Anda membuat entah bagaimana tautan antara model (Rails) dengan tabel database, Anda TIDAK PERNAH, TIDAK PERNAH, TIDAK PERNAH perlu
attr_accessor
dalam model Anda untuk membuat setter dan getter agar dapat memodifikasi Anda catatan tabel.Ini karena model Anda mewarisi semua metode dari
ActiveRecord::Base
Kelas, yang sudah mendefinisikan aksesor CRUD dasar (Buat, Baca, Perbarui, Hapus) untuk Anda. Ini dijelaskan pada dokumen resmi di sini Rails Model dan di sini Menimpa akseptor default (gulir ke bawah ke bab "Timpa accessor default")Katakan misalnya bahwa: kami memiliki tabel database yang disebut "pengguna" yang berisi tiga kolom "nama depan", "nama belakang" dan "peran":
Instruksi SQL:
Saya berasumsi bahwa Anda menetapkan opsi
config.active_record.whitelist_attributes = true
di config / environment / production.rb Anda untuk melindungi aplikasi Anda dari eksploitasi penugasan massal. Ini dijelaskan di sini: Penugasan MassalModel Rails Anda akan bekerja dengan baik dengan Model di bawah ini:
Namun Anda perlu memperbarui setiap atribut pengguna secara terpisah di controller Anda agar Tampilan formulir Anda berfungsi:
Sekarang untuk memudahkan hidup Anda, Anda tidak ingin membuat pengontrol yang rumit untuk model Pengguna Anda. Jadi Anda akan menggunakan
attr_accessible
metode khusus dalam model Kelas Anda:Jadi, Anda dapat menggunakan "jalan raya" (penugasan massal) untuk memperbarui:
Anda tidak menambahkan atribut "peran" ke
attr_accessible
daftar karena Anda tidak membiarkan pengguna mengatur sendiri peran mereka (seperti admin). Anda melakukannya sendiri di Tampilan admin khusus lain.Meskipun tampilan pengguna Anda tidak menampilkan bidang "peran", bajak laut dapat dengan mudah mengirim permintaan HTTP POST yang menyertakan "peran" dalam hash params. Atribut "peran" yang hilang pada
attr_accessible
adalah untuk melindungi aplikasi Anda dari itu.Anda masih dapat memodifikasi atribut user.role Anda sendiri seperti di bawah ini, tetapi tidak dengan semua atribut secara bersamaan.
Kenapa Anda akan menggunakan
attr_accessor
?Nah, ini dalam kasus bahwa formulir pengguna Anda menunjukkan bidang yang tidak ada di tabel pengguna Anda sebagai kolom.
Misalnya, katakanlah tampilan pengguna Anda menunjukkan bidang "tolong-beri tahu admin bahwa saya di sini". Anda tidak ingin menyimpan info ini di tabel Anda. Anda hanya ingin Rails mengirimi Anda email yang memperingatkan Anda bahwa satu "gila" ;-) pengguna telah berlangganan.
Untuk dapat menggunakan informasi ini, Anda perlu menyimpannya sementara di suatu tempat. Apa yang lebih mudah daripada memulihkannya di
user.peekaboo
atribut?Jadi, Anda menambahkan bidang ini ke model Anda:
Jadi Anda akan dapat menggunakan
user.peekaboo
atribut yang terdidik di suatu tempat di controller Anda untuk mengirim email atau melakukan apa pun yang Anda inginkan.ActiveRecord tidak akan menyimpan atribut "peekaboo" di tabel Anda ketika Anda melakukan
user.save
karena dia tidak melihat kolom yang cocok dengan nama ini dalam modelnya.sumber
attr_accessor
adalah metode Ruby yang memberi Anda metode penyetel dan pengambil ke variabel instan dengan nama yang sama. Jadi itu setara denganattr_accessible
adalah metode Rails yang menentukan variabel apa yang dapat diatur dalam penugasan massal.Ketika Anda mengirimkan formulir, dan Anda memiliki sesuatu seperti itu
MyModel.new params[:my_model]
maka Anda ingin memiliki sedikit lebih banyak kontrol, sehingga orang tidak dapat mengirimkan hal-hal yang tidak Anda inginkan.Anda dapat melakukannya
attr_accessible :email
sehingga ketika seseorang memperbarui akun mereka, mereka dapat mengubah alamat email mereka. Tetapi Anda tidak akan melakukannyaattr_accessible :email, :salary
karena seseorang dapat menetapkan gajinya melalui pengajuan formulir. Dengan kata lain, mereka bisa meretas jalan mereka ke kenaikan gaji.Informasi seperti itu perlu ditangani secara eksplisit. Hanya menghapusnya dari formulir tidak cukup. Seseorang bisa masuk dengan pembakar dan menambahkan elemen ke dalam formulir untuk mengirimkan bidang gaji. Mereka dapat menggunakan ikal bawaan untuk mengirim gaji baru ke metode pembaruan pengontrol, mereka dapat membuat skrip yang mengirimkan kiriman dengan informasi itu.
Begitu
attr_accessor
juga tentang menciptakan metode untuk menyimpan variabel, danattr_accessible
tentang keamanan penugasan massal.sumber
attr_accesible
:as
!class User < ActiveRecord::Base
attr_accessor
adalah kode ruby dan digunakan saat Anda tidak memiliki kolom di basis data Anda, tetapi masih ingin menampilkan bidang dalam formulir Anda. Satu-satunya cara untuk mengizinkan ini adalah denganattr_accessor :fieldname
dan Anda dapat menggunakan bidang ini di Tampilan Anda, atau model, jika Anda inginkan, tetapi sebagian besar di View Anda.Mari kita perhatikan contoh berikut ini
Di sini kita telah menggunakan
attr_reader
( atribut yang dapat dibaca ) danattr_writer
( atribut yang dapat ditulis ) untuk mengakses tujuan. Tetapi kita dapat mencapai fungsi yang sama menggunakanattr_accessor
. Singkatnya, attr_accessor menyediakan akses ke metode pengambil dan penyetel.Jadi kode yang dimodifikasi adalah seperti di bawah ini
attr_accessible
memungkinkan Anda untuk membuat daftar semua kolom yang Anda inginkan untuk memungkinkan Penugasan Massal. Kebalikan dari ini adalahattr_protected
yang berarti bidang ini saya TIDAK ingin ada orang yang diizinkan untuk Misa. Kemungkinan besar itu akan menjadi bidang dalam basis data Anda yang tidak Anda inginkan ada orang lain. Seperti bidang status, atau sejenisnya.sumber
Dalam dua kata:
attr_accessor
adalahgetter
,setter
metode. sedangkanattr_accessible
dikatakan atribut tertentu dapat diakses atau tidak. itu dia.Saya ingin menambahkan kita harus menggunakan parameter Strong daripada
attr_accessible
melindungi dari penugasan massal.Bersulang!
sumber
Ikhtisar perbedaan singkat & ringkas:
sumber