【问题标题】:Unpermitted parameters despite whitelisting attribute rails 4尽管将属性 rails 4 列入白名单,但不允许使用的参数
【发布时间】:2016-10-17 08:35:50
【问题描述】:

我有一个属性:completed,它是一个布尔值(真/假)。在索引页面上,我有一个复选框,我希望在选中时更新该对象的值。这是我对复选框的内容:

<div class="task_area">
      <%= link_to task.title, task_path(task), class: 'wrapper_task_name'%>
      <%= form_for task do |f| %>
        <%= f.check_box :completed %>
        <%= f.submit 'update' %>
      <% end %>
</div>

我在我的 tasks_controller.rb 中将属性 :completed 列入了白名单:

def task_params
    params.require(:task).permit(:title, :text, :boolean, :current_user, :email, )
end 

但在日志中我得到:

Started PATCH "/tasks/45" for ::1 at 2016-10-16 17:35:43 -0400
Processing by TasksController#update as HTML
  Parameters: {"utf8"=>"���", "authenticity_token"=>"ogAki1fvq6Eq+ONwjxeYwf+ZOrmkv+EAuDmZRTEEJ05xB3cf/XyHEavNDZyBWUOL0gUuEOglyM2uDNoJHcDcJg==", "task"=>{"completed"=>"1"}, "commit"=>"update", "id"=>"45"}
  User Load (0.8ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
  Task Load (0.7ms)  SELECT  "tasks".* FROM "tasks" WHERE "tasks"."user_id" = $1 AND "tasks"."id" = $2 LIMIT 1  [["user_id", "1"], ["id", 45]]
Unpermitted parameter: completed
   (0.4ms)  BEGIN
   (0.4ms)  COMMIT
Redirected to http://localhost:3000/
Completed 302 Found in 22ms (ActiveRecord: 2.3ms)

我想知道是否设计需要用户身份验证会导致此问题。有谁知道我可以做些什么来解决这个问题?

【问题讨论】:

  • 我没有看到您已将 tasks_controller.rb 中的属性 :completed 列入白名单

标签: ruby-on-rails ruby web devise


【解决方案1】:

该字段的名称是 :completed 而不是 :boolean - 这是您需要在许可行中输入的内容。例如:

def task_params
  params.require(:task).permit(:title, :text, :completed, :current_user, :email)
end 

我也可以强烈建议不要将:current_user 设置为允许字段吗?这将允许恶意用户为另一个用户创建任务。我会将其从允许列表中删除,并在创建方法中手动添加,例如使用current_user.tasks.create(task_params)

【讨论】:

  • +1 关于 current_user。当前用户应该从会话中获取。如果您使用它来识别发送请求的用户,这同样适用于现场电子邮件
【解决方案2】:
def task_params
    params.require(:task).permit(:title, :text, :current_user, :email, :completed)
end 

上面的代码完成后被列入白名单。

【讨论】:

    【解决方案3】:

    您已在tasks_controller 的白名单参数中添加了completed_at 的类型(boolean)。应该是这样的

    def task_params
     params.require(:task).permit(:title, :text, :completed, :current_user, :email)
    end 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多