#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