Добре, открих проблема.
Първо, предполагам, че използвате Rails 4. Причината да получавате тази грешка е, че attr_protected
и attr_accessible
са премахнати от Rails 4 и поставени в техния собствен скъпоценен камък. Сега Rails насърчава нов модел на защита. Можете да прочетете за това в README
. Ако искате да продължите да използвате старото поведение, трябва да включите protected_attributes gem
. Надявам се, че това помага.
РЕДАКТИРАНЕ:Добавих разяснение по-долу, тъй като това вероятно ще бъде често срещан проблем с потребителите при надграждане до rails 4.
Ако искате да продължите да използвате attr_accessible
, т.е. начинът на Rails 3, просто добавете gem protected_attributes
към вашия Gemfile.
Ако искате да започнете да правите нещата по начина на Rails 4, вече не трябва да използвате attr_accessible
. Вместо това трябва да преместите логиката за разрешение за атрибут в контролера. Ето един пример:
class UsersController < ApplicationController
def create
# Using params[:user] without calling user_params will throw an error because
# the parameters were not filtered. This is just some Rails magic.
@user = User.new user_params
if @user.save
# Do whatever
else
render action: :new
end
end
private
def user_params
# params.require(:user) throws an error if params[:user] is nil
if current_user.nil? # Guest
# Remove all keys from params[:user] except :name, :email, :password, and :password_confirmation
params.require(:user).permit :name, :email, :password, :password_confirmation
elsif current_user.has_role :admin
params.require(:user).permit! # Allow all user parameters
elsif current_user.has_role :user
params.require(:user).permit :name, :email, :password, :password_confirmation
end
end