修复 Rails Gem ActiveModel::ForbiddenAttributesError 的 CanCan 错误
Fix Rails Gem CanCan bug for ActiveModel::ForbiddenAttributesError
尝试在 CanCan 设置为 manage: all
的模型上创建时,我不断收到此错误:
ActiveModel::ForbiddenAttributesError - ActiveModel::ForbiddenAttributesError:
我在网上找到了修复程序 here。
将此代码粘贴到我的应用程序控制器中:
before_filter do
resource = controller_name.singularize.to_sym
method = "#{resource}_params"
params[resource] &&= send(method) if respond_to?(method, true)
end
这导致了我的问题。我有两个具有 belongs_to_has_many
关联的模型和一个将用户添加到组的方法。
当我想使用 add_user
将用户添加到一个组时,它采用组 ID 和用户对象,我现在收到此错误。
例程调用者:
<%= link_to 'Add', add_user_group_path(group: @group, user_id: id) %>
该方法如下所示:
def add_user
group = Group.find(params[:id])
user = User.find(params[:user_id])
group.users << user
end
这是错误:
Parameters: {"group"=>"16", "id"=>"16", "user_id"=>"332"}
NoMethodError - undefined method `permit' for "16":String:
before_filter
是什么方法会导致此错误?
================更新===================
我终于弄明白了。
由于组 ID 是在来自控制器的 add_user 调用中自动传递的,因此我不得不更改此行:
<%= link_to 'Add', add_user_group_path(group: @group, user_id: id) %>
至:
<%= link_to 'Add', add_user_group_path(user_id: id) %>
现在可以使用了。事实证明,当您传递 @group 对象时,参数 "group => x" 被解析得很奇怪。
CanCan 不支持 Rails4。使用 CanCanCan,您不需要任何这些解决方法。就像我们通常在 Rails4 中所做的那样,只需以下一些方法即可。
create_params or update_params (depending on the action you are performing)
_params such as article_params (this is the
default convention in rails for naming your param method)
resource_params (a generically named method you could specify in each
controller)
尝试在 CanCan 设置为 manage: all
的模型上创建时,我不断收到此错误:
ActiveModel::ForbiddenAttributesError - ActiveModel::ForbiddenAttributesError:
我在网上找到了修复程序 here。
将此代码粘贴到我的应用程序控制器中:
before_filter do
resource = controller_name.singularize.to_sym
method = "#{resource}_params"
params[resource] &&= send(method) if respond_to?(method, true)
end
这导致了我的问题。我有两个具有 belongs_to_has_many
关联的模型和一个将用户添加到组的方法。
当我想使用 add_user
将用户添加到一个组时,它采用组 ID 和用户对象,我现在收到此错误。
例程调用者:
<%= link_to 'Add', add_user_group_path(group: @group, user_id: id) %>
该方法如下所示:
def add_user
group = Group.find(params[:id])
user = User.find(params[:user_id])
group.users << user
end
这是错误:
Parameters: {"group"=>"16", "id"=>"16", "user_id"=>"332"} NoMethodError - undefined method `permit' for "16":String:
before_filter
是什么方法会导致此错误?
================更新===================
我终于弄明白了。
由于组 ID 是在来自控制器的 add_user 调用中自动传递的,因此我不得不更改此行:
<%= link_to 'Add', add_user_group_path(group: @group, user_id: id) %>
至:
<%= link_to 'Add', add_user_group_path(user_id: id) %>
现在可以使用了。事实证明,当您传递 @group 对象时,参数 "group => x" 被解析得很奇怪。
CanCan 不支持 Rails4。使用 CanCanCan,您不需要任何这些解决方法。就像我们通常在 Rails4 中所做的那样,只需以下一些方法即可。
create_params or update_params (depending on the action you are performing)
_params such as article_params (this is the default convention in rails for naming your param method)
resource_params (a generically named method you could specify in each controller)