Saya memiliki model ini di Ruby tetapi melempar a ActiveModel::ForbiddenAttributesError
class User < ActiveRecord::Base
attr_accessor :password
validates :username, :presence => true, :uniqueness => true, :length => {:in => 3..20}
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, :uniqueness => true, format: { with: VALID_EMAIL_REGEX }
validates :password, :confirmation => true
validates_length_of :password, :in => 6..20, :on => :create
before_save :encrypt_password
after_save :clear_password
def encrypt_password
if password.present?
self.salt = BCrypt::Engine.generate_salt
self.encrypted_password= BCrypt::Engine.hash_secret(password, salt)
end
end
def clear_password
self.password = nil
end
end
ketika saya menjalankan tindakan ini
def create
@user = User.new(params[:user])
if @user.save
flash[:notice] = "You Signed up successfully"
flash[:color]= "valid"
else
flash[:notice] = "Form is invalid"
flash[:color]= "invalid"
end
render "new"
end
pada ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
.
Bisakah Anda memberi tahu saya cara menghilangkan kesalahan ini atau membuat formulir pendaftaran pengguna yang tepat?
protected_attributes
permata untuk digunakanattr_accessible
.Jawaban:
Saya kira Anda menggunakan Rails 4. Jika demikian, parameter yang diperlukan harus ditandai sesuai kebutuhan.
Anda mungkin ingin melakukannya seperti ini:
sumber
strong_parameter
permata. Hal ini tercakup dalam Rails Guides: guides.rubyonrails.org/… .Bagi yang menggunakan CanCan . Orang-orang mungkin mengalami ini jika mereka menggunakan CanCan dengan Rails 4+ . Coba solusi penyelesaian AntonTrapps yang agak bersih di sini sampai CanCan diperbarui:
Dalam
ApplicationController
:dan di pengontrol sumber daya (misalnya NoteController):
Memperbarui:
Berikut adalah proyek lanjutan untuk CanCan yang disebut CanCanCan , yang terlihat menjanjikan:
CanCanCan
sumber
load_resource
atau menggunakanload_resource :except => :create
memecahkan masalah. Periksa jawaban asli di siniAda cara yang lebih mudah untuk menghindari Parameter Kuat sama sekali, Anda hanya perlu mengubah parameter ke hash biasa, seperti:
Ini mengalahkan tujuan parameter yang kuat tentu saja, tetapi jika Anda berada dalam situasi seperti milik saya (saya melakukan manajemen saya sendiri dari params yang diizinkan di bagian lain dari sistem saya) ini akan menyelesaikan pekerjaan.
sumber
unable to convert unpermitted parameters to hash
Jika menggunakan ActiveAdmin jangan lupa bahwa ada juga permit_params di blok register model:
Ini perlu diatur bersama dengan yang ada di controller:
Kalau tidak, Anda akan mendapatkan kesalahan:
sumber
Bagi mereka yang menggunakan CanCanCan :
Anda akan mendapatkan kesalahan ini jika CanCanCan tidak dapat menemukan metode params yang benar .
Untuk
:create
tindakan tersebut, CanCan akan mencoba menginisialisasi instance baru dengan input yang disanitasi dengan melihat apakah controller Anda akan merespons metode berikut (secara berurutan):create_params
<model_name>_params
seperti article_params (ini adalah konvensi default di rails untuk memberi nama metode param Anda)resource_params
(metode yang diberi nama umum yang dapat Anda tentukan di setiap pengontrol)Selain itu,
load_and_authorize_resource
sekarang dapat mengambilparam_method
opsi untuk menentukan metode kustom di controller untuk menjalankan untuk membersihkan input.Anda dapat mengaitkan
param_method
opsi dengan simbol yang sesuai dengan nama metode yang akan dipanggil:sumber: https://github.com/CanCanCommunity/cancancan#33-strong-parameters
sumber
Atau Anda dapat menggunakan permata Atribut Terlindungi , namun ini mengalahkan tujuan yang membutuhkan params yang kuat. Namun jika Anda memutakhirkan aplikasi yang lebih lama, Atribut Terlindungi memang menyediakan jalur mudah untuk memutakhirkan hingga Anda dapat mengubah attr_accessible menjadi params yang kuat.
sumber
Jika Anda menggunakan Rails 4 dan Anda mendapatkan kesalahan ini, itu bisa terjadi jika Anda menggunakan
enum
pada model jika Anda telah mendefinisikan dengan simbol seperti ini:Formulir akan lulus katakanlah pemilih radio sebagai param string. Itulah yang terjadi dalam kasus saya. Perbaikan sederhana adalah mengubah
enum
string bukan simbolsumber