【问题标题】:Strong params in railsRails 中的强参数
【发布时间】:2015-06-16 15:34:47
【问题描述】:

我删除了以下行的批量分配漏洞:

friend = Friend.find(params[:id])
friend.update_attributes(params[:name])

重写为:

friend = Friend.find(params[:id])
friend.update_attributes(params.permit(:name))

但这给了我这个错误:

ActiveModel::MassAssignmentSecurity::Error (Can't mass-assign protected attributes for Friend: name):
Unpermitted parameters: id

知道为什么我会收到此错误吗?

Edit :

我添加了attr_accessible :status_idparams.permit(:id, :name),错误被删除。但是添加attr_accessible 是正确的做法,因为我们编写了强大的参数来删除这一行,不是吗?

【问题讨论】:

  • 你的模型中有attr_accessible吗?
  • 显示params.inspect。确保您正在检查代码的正确部分 - 也许您编辑更新方法,但触发了创建方法。
  • params.permit(:name, :id)
  • 我已经从我的模型中删除了 attr_accessible 并且做 params.permit(:name, :id) 不起作用
  • 解决此问题的一种快速方法是根本不从前端发送id,正如您在此处提到的“params = {"name"=>"John", "id"=>"15"}”。因为无论如何你都没有将它保存到数据库中

标签: ruby-on-rails security ruby-on-rails-4 mass-assignment


【解决方案1】:

尝试将您的代码更新为friend.update_attributes(params.permit(:name, :id)) 允许该参数。

【讨论】:

  • 没用。得到这个ActiveModel::MassAssignmentSecurity::Error (Can't mass-assign protected attributes for Friend: id, name)
【解决方案2】:

你应该这样做

friend.update_attributes(params.require(:friend).permit(:name))

或将其放入私有方法中

private
def object_params
  params.require(:friend).permit(:name)
end

然后通过调用

friend.update_attributes object_params

编辑: 我假设你的参数看起来像

{friend:{name:'xxxxx'},id:xx}

【讨论】:

  • 我不能这样做,因为我从前端获得了名为 params 的参数。
  • 再看一下这个例子。我只是将参数放入私有控制器方法中。 :)。你可以用这个friend.update_attributes(params.require(:friend).permit(:name))
  • 你的假设是错误的,我的参数看起来像:params = {"name"=>"John", "id"=>"15"}
  • 哦,好的。谢谢你。您的模型成为带有名称和 ID 的哈希,并且您只允许名称。所以错误是正确的,因为您不想将 id 放入 update_attribute。尝试params.slice(:name).permit(:name) 进行更新
  • 我还需要使用attr_accessible :name吗,因为没有这条线就不行
【解决方案3】:

不要在模型中写 attr_accessible,Rails 4 使用 strong 参数。

试试这个代码。

friend = Friend.find(params[:id])
friend.update_attributes(friend_params)

private

  def friend_params    
    params.require(:friend).permit!    
  end

【讨论】:

  • 正如我所说,我的参数是params,而不是friend
  • 在获取朋友的参数时,需要要求朋友允许恶魔模型的参数。我的代码有效吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 2013-12-07
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多