Rails,强参数,部分需要

时间:2016-02-23 14:00:19

标签: ruby-on-rails strong-parameters

我正在使用CarrierWave并且能够移除图片,我需要允许不属于用户的参数:

params.require(:user).permit(:first_name, :last_name, :description, :picture, :remove_picture)

它给了我错误,但将其更改为:

params.permit(:first_name, :last_name, :description, :picture, :remove_picture)

正如在论坛上的一个主题中所建议的那样,也给出了错误 - “未经许可的参数提交,id”等。我怎样才能要求用户同时允许remove_picture?

1 个答案:

答案 0 :(得分:2)

您应该将remove_picture属性嵌套在用户下,如readme中的示例所示:

<%= form_for @user, html: { multipart: true } do |f| %>
  <p>
    <label>My Avatar</label>
    <%= image_tag(@user.avatar_url) if @user.avatar? %>
    <%= f.file_field :avatar %>
  </p>

  <p>
    <label>
      <%= f.check_box :remove_avatar %>
      Remove avatar
    </label>
  </p>
<% end %>

那会让你做到

params.require(:user)
      .permit(:first_name, :last_name, :description, :picture, :remove_picture)

Rails质量分配保护基本上只是哈希切片:

  • .require从哈希中提取一个密钥,如果不存在则会引发错误。
  • .permit返回允许的键,并将散列标记为可以安全进行质量分配。

它处理嵌套在单个param键下或根目录下的哈希。虽然你可以疯狂地合并两个哈希:

p = params.require(:user)
          .permit(:first_name, :last_name, :description, :picture)
p.merge!(params.permit(:remove_picture))

你只是为自己制造问题。