[ruby-on-rails] 새 사용자를 만들 때 ActiveModel :: ForbiddenAttributesError

루비 로이 모델이 있지만 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을 위한 지속적인 프로젝트입니다 .

CanCanCan


답변

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

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은 컨트롤러가 다음 방법에 따라 순서대로 응답하는지 확인하여 위생 입력으로 새 인스턴스를 초기화하려고 시도합니다.

  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


답변

또는 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']