루비 로이 모델이 있지만 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
이 동작을 실행할 때
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
에 ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
.
이 오류를 제거하거나 적절한 사용자 등록 양식을 설정하는 방법을 알려주시겠습니까?
답변
Rails 4를 사용하고 있다고 생각합니다. 그렇다면 필요한 매개 변수를 필요에 따라 표시해야합니다.
다음과 같이하고 싶을 수도 있습니다.
class UsersController < ApplicationController
def create
@user = User.new(user_params)
# ...
end
private
def user_params
params.require(:user).permit(:username, :email, :password, :salt, :encrypted_password)
end
end
답변
CanCan을 사용하는 사람들을 위해 . Rails 4+ 와 함께 CanCan 을 사용하는 경우이 문제가 발생할 수 있습니다 . CanCan이 업데이트 될 때까지 AntonTrapps의 다소 깨끗한 해결 방법을 시도 하십시오 .
에서 ApplicationController
:
before_filter do
resource = controller_name.singularize.to_sym
method = "#{resource}_params"
params[resource] &&= send(method) if respond_to?(method, true)
end
리소스 컨트롤러 (예 : NoteController)에서 :
private
def note_params
params.require(:note).permit(:what, :ever)
end
최신 정보:
다음은 CanCan Can이라는 CanCan Can을 위한 지속적인 프로젝트입니다 .
답변
강력한 매개 변수를 피하는 더 쉬운 방법이 있습니다. 다음과 같이 매개 변수를 일반 해시로 변환하면됩니다.
unlocked_params = ActiveSupport::HashWithIndifferentAccess.new(params)
model.create!(unlocked_params)
이것은 물론 강력한 매개 변수의 목적을 상실하지만, 당신이 내 상황과 같은 경우 (내 시스템의 다른 부분에서 허용되는 매개 변수를 직접 관리하고 있음)이 작업을 수행합니다.
답변
ActiveAdmin을 사용하는 경우 모델 레지스터 블록에 permit_params도 있다는 것을 잊지 마십시오.
ActiveAdmin.register Api::V1::Person do
permit_params :name, :address, :etc
end
이것들은 컨트롤러의 것들과 함께 설정해야합니다 :
def api_v1_person_params
params.require(:api_v1_person).permit(:name, :address, :etc)
end
그렇지 않으면 오류가 발생합니다.
ActiveModel::ForbiddenAttributesError
답변
CanCanCan을 사용하는 사람들 :
CanCanCan이 올바른 params 메소드를 찾을 수없는 경우이 오류가 발생합니다 .
이 :create
작업을 위해 CanCan은 컨트롤러가 다음 방법에 따라 순서대로 응답하는지 확인하여 위생 입력으로 새 인스턴스를 초기화하려고 시도합니다.
create_params
<model_name>_params
예 : article_params (param 메소드의 이름을 지정하기위한 레일의 기본 규칙)resource_params
(각 컨트롤러에서 지정할 수있는 일반적으로 명명 된 방법)
또한 load_and_authorize_resource
이제 param_method
컨트롤러에서 입력을 삭제하기 위해 실행할 사용자 정의 방법을 지정 하는 옵션을 사용할 수 있습니다 .
param_method
옵션을 호출 할 메소드 이름에 해당하는 기호와 옵션을 연관시킬 수 있습니다 .
class ArticlesController < ApplicationController
load_and_authorize_resource param_method: :my_sanitizer
def create
if @article.save
# hurray
else
render :new
end
end
private
def my_sanitizer
params.require(:article).permit(:name)
end
end
출처 :
https://github.com/CanCanCommunity/cancancan#33-strong-parameters
답변
또는 Protected Attributes gem을 사용할 수 있지만 강력한 매개 변수가 필요하다는 목적을 상실합니다. 그러나 이전 앱을 업그레이드하는 경우 보호 된 속성은 attr_accessible을 강력한 매개 변수로 리팩터링 할 수있을 때까지 업그레이드하기 쉬운 경로를 제공합니다.
답변
Rails 4를 사용 중이고이 오류가 발생하면 다음 enum
과 같은 기호로 정의한 경우 모델에서 사용 중인 경우 발생할 수 있습니다 .
class User
enum preferred_phone: [:home_phone, :mobile_phone, :work_phone]
end
이 형식은 라디오 선택기를 문자열 매개 변수로 전달합니다. 그것이 제 사건에서 일어난 일입니다. 간단한 수정은 enum
기호 대신 문자열 로 변경 하는 것입니다
enum preferred_phone: %w[home_phone mobile_phone work_phone]
# or more verbose
enum preferred_phone: ['home_phone', 'mobile_phone', 'work_phone']