@destroy_sys

[param is missing or the value is empty: task] Как решить?

Делаю ToDo приложение(все, что сейчас делаю - чисто для отработки навыков, понимая, где пробелы). Столкнулся с проблемой, не знаю как реализовать следующее:
При нажатии на галочку, параметр задачи :complete_task меняется с false на true.
451a9e43fab34527ad982d4657fdde64.png

Я решил, что у меня проблема с оформлением route'ов. Сам попытался реализовать следующим образом:
В контроллере задач создал метод
def complete_todo
	@task = Task.find(params[:id])
	@task.complete_task = true
	if @task.update(task_params)
		redirect_to root_path
	end
end


В маршрут прописал:
post 'tasks/complete_todo/:id',    to: 'tasks#complete_todo', as: 'finished_task'


Как решить эту проблему - не знаю, часа 4 уже мучаюсь. Про попытке отметить задачу выполненной вылетает ошибка:
param is missing or the value is empty: task
  • Вопрос задан
  • 4766 просмотров
Решения вопроса 2
Jeiwan
@Jeiwan
param is missing or the value is empty: task

Экшен ожидает, что придет параметр 'task', но он не приходит. Почему? А потому, что вы его не отсылаете. То есть у вас неправильно оформлена форма. А точнее, у вас вообще формы нету.

{"authenticity_token"=>"Y8hE4tSk/qUL1xZDpCgvriUwYhmwfzeH3iwfxa7NB+C6DEKkvJLAQ4V3b6yTw4QUxOMPUTxoGKv36PYxpzmCoQ==", "id"=>"10"}

Вот доказательство, что 'task' не передается.

if @task.update(task_params)

Зачем этот апдейт нужен? Какова логика? Зачем обновлять весь таск?

@task.complete_task = true

Вообще, так в контроллерах делать не комильфо. С БД должна работать модель. Лучше сделать метод 'complete!' в модели и в контроллере просто вызывать @task.complete!

Ну и роут не совсем верный.
post 'tasks/:id/complete', to: 'tasks#complete', as: 'complete_task'
– так бы было правильнее. Соответственно и экшен переименовать.

Или если делать ресурс:
resources :tasks do
  post :complete, on: :member
end


Как исправить, думаю, теперь догадаетесь :)
Ответ написан
viktorvsk
@viktorvsk
Во-первых, сделайте
# config/routes.rb
resources :tasks do
 match :complete_todo, on: :member, as: :finished_task, via: :post
end


А дальше, пока непонятно, что за ошибка и где. Порядок дебага:
1. Убедиться, что существует нужный роут и формируется правильная ссылка с правильным методомо (пост, гет) и форматом (html, js и т.д.)
2. Убедиться, что запрос попадает в нужный экшн
3. Убедиться, что таск выбран

Про попытке отметить задачу выполненной вылетает ошибка: param is missing or the value is empty: task


Непонятно, ошибка на клиенте или на сервере. Непонятно, что за ошибка (у эксепшенов есть классы). Непонятно, в каком месте возникает (у эксепшенов есть трейс)

Ну, а вообще, скорее всего, вы забыли про стронг парамс и просто так написали:
@task.update(task_params)

и не обновили сам метод:
private
def task_params
params.require(:task)
...
end


Или вообще не написали его
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы