Ok, tôi đã tìm thấy vấn đề.
Trước hết, tôi cho rằng bạn đang sử dụng Rails 4. Lý do bạn gặp lỗi này là do attr_protected
và attr_accessible
đã bị xóa khỏi Rails 4 và được đặt trong gem của riêng chúng. Rails hiện đang khuyến khích một mô hình bảo vệ mới. Bạn có thể đọc về điều này trong README
. Nếu bạn muốn tiếp tục sử dụng hành vi cũ, bạn phải bao gồm đá quý protected_attributes
. Hy vọng điều đó sẽ hữu ích.
CHỈNH SỬA:Tôi đã thêm phần giải thích bên dưới vì đây có thể là sự cố phổ biến với người dùng khi nâng cấp lên đường ray 4.
Nếu bạn muốn tiếp tục sử dụng attr_accessible
, tức là theo cách Rails 3, chỉ cần thêm gem protected_attributes
vào Gemfile của bạn.
Nếu bạn muốn bắt đầu thực hiện mọi thứ theo cách Rails 4, bạn không được sử dụng attr_accessible
nữa . Thay vào đó, bạn phải di chuyển logic quyền thuộc tính vào bộ điều khiển. Đây là một ví dụ:
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