Недопустимые параметры, несмотря на белый список атрибутов rails 4

#ruby-on-rails #ruby #web #devise

#ruby-on-rails #ruby #веб #разработать

Вопрос:

У меня есть атрибут :завершено, то есть логическое значение (true / false). На странице индекса у меня есть флажок, который я хотел бы, если он установлен, обновить это значение для объекта. Вот что у меня есть для флажка:

 <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:

 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)
 

Мне интересно, вызывает ли эта проблема необходимость разработки аутентификации пользователя. Есть ли у кого-нибудь идеи относительно того, что я могу сделать, чтобы исправить это?

Комментарии:

1. Я не вижу, что вы внесли атрибут в белый список:завершено в tasks_controller.rb

Ответ №1:

Имя поля :completed отсутствует :boolean — это то, что вам нужно указать в строке разрешения. например:

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

Также могу ли я настоятельно рекомендовать :current_user не использовать разрешенное поле? Это позволит злоумышленнику создать задачу для другого пользователя. Я бы оставил его вне списка разрешенных и добавил его вручную в методе create, например, с помощью current_user.tasks.create(task_params)

Комментарии:

1. 1 о current_user. Текущий пользователь должен быть получен из сеанса. То же самое относится к электронной почте поля, если вы используете его для идентификации пользователя, который отправляет запрос

Ответ №2:

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

После завершения приведенного выше кода он попадает в белый список.

Ответ №3:

Вы добавили type( boolean ) of completed_at в свои параметры из белого списка tasks_controller . Это должно быть так

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