새 사용자를 만들 때 ActiveModel :: ForbiddenAttributesError


223

루비 로이 모델이 있지만 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].

이 오류를 제거하거나 적절한 사용자 등록 양식을 설정하는 방법을 알려주시겠습니까?


2
attr_accessible : password, : password_confirmation, : user_name, : email, : your-other-attributes를 사용자 모델에
추가해보십시오

1
attr_accessible 을 사용하려면 strong_parameter gem을 추가하십시오 .
Wenbing Li

attr_accessible을 사용하기위한 강력한 매개 변수?!
Thiem Nguyen

1
@BruceLi의 의미는 다음과 같습니다 . protected_attributes사용할 gem을 추가하십시오 attr_accessible.
Stefan Magnuson

답변:


398

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

2
왜 작동하는지 또는 왜 필요한지에 대한 문서가 있습니까?
DiverseAndRemote.com

20
@OmarJackman이 기능은 strong_parametergem에서 제공합니다 . Rails Guides : guides.rubyonrails.org/…에서 다룹니다 .
Domon

21
Rails 4.0에서 CanCan 을 사용하는 경우이 문제가 발생할 수 있습니다 . CanCan이 업데이트 될 때까지 AntonTrapps의 다소 깨끗한 해결 방법을 시도하십시오 .
mjnissim

@mjnissim이 답변을 별도의 답변으로 게시 하시겠습니까? 나는 그것을 처음으로 놓쳤지만 여전히 많은 시간을 절약했습니다.
Paul Pettengill

64

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을 위한 지속적인 프로젝트입니다 .

CanCanCan


1
감사!! CanCanCan (활성)이 해결 되었거나이 코드가 필요없는 질문이 있습니까?
Adriano Resende

저에게는 CanCanCan에 여전히 문제가 있습니다. 사용하지 load_resource않거나 사용 load_resource :except => :create하면 문제가 해결되었습니다. 원래 답변을 확인 하십시오
Tun

24

강력한 매개 변수를 피하는 더 쉬운 방법이 있습니다. 다음과 같이 매개 변수를 일반 해시로 변환하면됩니다.

unlocked_params = ActiveSupport::HashWithIndifferentAccess.new(params)

model.create!(unlocked_params)

이것은 물론 강력한 매개 변수의 목적을 상실하지만, 당신이 내 상황과 같은 경우 (내 시스템의 다른 부분에서 허용되는 매개 변수를 직접 관리하고 있음)이 작업을 수행합니다.


레일 6에서는 작동하지 않습니다. 예외 :unable to convert unpermitted parameters to hash
타일러

20

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

18

CanCanCan을 사용하는 사람들 :

CanCanCan이 올바른 params 메소드를 찾을 수없는 경우이 오류가 발생합니다 .

:create작업을 위해 CanCan은 컨트롤러가 다음 방법에 따라 순서대로 응답하는지 확인하여 위생 입력으로 새 인스턴스를 초기화하려고 시도합니다.

  1. create_params
  2. <model_name>_params 예 : article_params (param 메소드의 이름을 지정하기위한 레일의 기본 규칙)
  3. 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


3

또는 Protected Attributes gem을 사용할 수 있지만 강력한 매개 변수가 필요하다는 목적을 상실합니다. 그러나 이전 앱을 업그레이드하는 경우 보호 된 속성은 attr_accessible을 강력한 매개 변수로 리팩터링 할 수있을 때까지 업그레이드하기 쉬운 경로를 제공합니다.


0

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']
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.