ActiveModel::ForbiddenAttributesError when creating new user

后端 未结 7 1745
礼貌的吻别
礼貌的吻别 2020-11-22 15:59

I have this model in Ruby but it throws a ActiveModel::ForbiddenAttributesError

class User < ActiveRecord::Base
  attr_accessor :password
  v         


        
相关标签:
7条回答
  • 2020-11-22 16:31

    There is an easier way to avoid the Strong Parameters at all, you just need to convert the parameters to a regular hash, as:

    unlocked_params = ActiveSupport::HashWithIndifferentAccess.new(params)
    
    model.create!(unlocked_params)
    

    This defeats the purpose of strong parameters of course, but if you are in a situation like mine (I'm doing my own management of allowed params in another part of my system) this will get the job done.

    0 讨论(0)
  • 2020-11-22 16:39

    If using ActiveAdmin don't forget that there is also a permit_params in the model register block:

    ActiveAdmin.register Api::V1::Person do
      permit_params :name, :address, :etc
    end
    

    These need to be set along with those in the controller:

    def api_v1_person_params
      params.require(:api_v1_person).permit(:name, :address, :etc)
    end
    

    Otherwise you will get the error:

    ActiveModel::ForbiddenAttributesError
    
    0 讨论(0)
  • 2020-11-22 16:40

    I guess you are using Rails 4. If so, the needed parameters must be marked as required.

    You might want to do it like this:

    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
    
    0 讨论(0)
  • 2020-11-22 16:43

    If you are on Rails 4 and you get this error, it could happen if you are using enum on the model if you've defined with symbols like this:

    class User
      enum preferred_phone: [:home_phone, :mobile_phone, :work_phone]
    end
    

    The form will pass say a radio selector as a string param. That's what happened in my case. The simple fix is to change enum to strings instead of symbols

    enum preferred_phone: %w[home_phone mobile_phone work_phone]
    # or more verbose
    enum preferred_phone: ['home_phone', 'mobile_phone', 'work_phone']
    
    0 讨论(0)
  • 2020-11-22 16:46

    Alternatively you can use the Protected Attributes gem, however this defeats the purpose of requiring strong params. However if you're upgrading an older app, Protected Attributes does provide an easy pathway to upgrade until such time that you can refactor the attr_accessible to strong params.

    0 讨论(0)
  • 2020-11-22 16:52

    For those using CanCan. People might be experiencing this if they use CanCan with Rails 4+. Try AntonTrapps's rather clean workaround solution here until CanCan gets updated:

    In the ApplicationController:

    before_filter do
      resource = controller_name.singularize.to_sym
      method = "#{resource}_params"
      params[resource] &&= send(method) if respond_to?(method, true)
    end
    

    and in the resource controller (for example NoteController):

    private
    def note_params
      params.require(:note).permit(:what, :ever)
    end
    

    Update:

    Here's a continuation project for CanCan called CanCanCan, which looks promising:

    CanCanCan

    0 讨论(0)
提交回复
热议问题