отсутствуют необходимые ключи: [: id] при обновлении вложенного элемента

прежде всего большое спасибо за то, что помогли мне.

Я работаю над инструментом проекта, у меня есть модель проекта has_many project_tasks. Project_tasks принадлежит проекту.

Я пытаюсь пометить как законченное действие для задач проекта, но мне кажется, что я не могу получить идентификатор project_task в действии патча.

Вот мои маршруты: (Обратите внимание, что у меня тоже есть полное действие для проекта, но оно работает нормально)

resources :projects do
    resources :project_tasks do
      member do
        patch :complete
      end
    end
    member do
      patch :complete
    end
  end

Рейк-маршруты

complete_project_project_task PATCH  /projects/:project_id/project_tasks/:id/complete(.:format) project_tasks#complete
        project_project_tasks GET    /projects/:project_id/project_tasks(.:format)              project_tasks#index
                              POST   /projects/:project_id/project_tasks(.:format)              project_tasks#create
     new_project_project_task GET    /projects/:project_id/project_tasks/new(.:format)          project_tasks#new
    edit_project_project_task GET    /projects/:project_id/project_tasks/:id/edit(.:format)     project_tasks#edit
         project_project_task GET    /projects/:project_id/project_tasks/:id(.:format)          project_tasks#show
                              PATCH  /projects/:project_id/project_tasks/:id(.:format)          project_tasks#update
                              PUT    /projects/:project_id/project_tasks/:id(.:format)          project_tasks#update
                              DELETE /projects/:project_id/project_tasks/:id(.:format)          project_tasks#destroy
             complete_project PATCH  /projects/:id/complete(.:format)                           projects#complete
                     projects GET    /projects(.:format)                                        projects#index
                              POST   /projects(.:format)                                        projects#create
                  new_project GET    /projects/new(.:format)                                    projects#new
                 edit_project GET    /projects/:id/edit(.:format)                               projects#edit
                      project GET    /projects/:id(.:format)                                    projects#show
                              PATCH  /projects/:id(.:format)                                    projects#update
                              PUT    /projects/:id(.:format)                                    projects#update
                              DELETE /projects/:id(.:format)                                    projects#destroy

Вид:

<%= link_to '', complete_project_project_task_path(@project, project_task.id), class: "glyphicon glyphicon-ok", id: "complete-#{project_task.id}", method: :patch %>

И действие контроллера:

def complete
    @project = Project.find(params[:project_id])
    @project_task = project.project_task.find(params[:id])
    if @project_task.completed_at.blank?
      @project_task.update_attribute(:completed_at, Time.now)
      flash[:success] = 'Task Completed!'
      redirect_to root_path
    else
      @project_task.update_attribute(:completed_at, '')
      flash[:info] = 'Task Updated!'
      redirect_to root_path
    end
  end

Я получаю следующую ошибку: Нет совпадений маршрута {: action => "complete",: controller => "project_tasks",: id => nil,: project_id => "26"} отсутствуют необходимые ключи: [: id]

В link_to я добавляю 2 аргумента: @project (чтобы получить идентификатор проекта) и project_task.id. Кажется, я получаю правильный идентификатор проекта, но не project_task.id. Я попытался изменить действие контроллера на @project_task = ProjectTask.find (params [: id]), но безуспешно. (Я также пробовал несколько вещей с разными аргументами в link_to) Я не уверен, как это получить, но надеюсь, что один из вас может указать мне правильное направление.

Заранее спасибо!


person Charli Bregnballe    schedule 03.01.2017    source источник
comment
Можете ли вы обновить вопрос выводом rake routes   -  person Dan Rubio    schedule 03.01.2017
comment
Да, сейчас обновлено.   -  person Charli Bregnballe    schedule 03.01.2017
comment
Что произойдет, если вместо использования complete_project_project_task_path (@project, project_task.id) вы укажете ему следующий путь (внутри link_to) /projects/#{@project.id}/project_tasks/#{project_task.id}/complete? Вы все еще получаете ту же ошибку?   -  person Matija Munjakovic    schedule 03.01.2017
comment
Это действительно работает! Затем, когда я нажимаю ссылку, я получаю сообщение об ошибке: Нет маршрута соответствует [PATCH] / projects / 26 / project_tasks / 1 / c% E2% 80% 8C% E2% 80% 8Bomplete Но я думаю, что это подтверждает, что link_to не хватает project_task.id, верно?   -  person Charli Bregnballe    schedule 04.01.2017


Ответы (2)


Похоже, ваша переменная project_task в представлении настроена неправильно. Ваш код должен выглядеть примерно так:

<% @project.project_tasks.each do |project_task| %>
  <%= link_to '', complete_project_project_task_path(@project, project_task.id), class: "glyphicon glyphicon-ok", id: "complete-#{project_task.id}", method: :patch %>
<% end %>

(Это касается вашей Project модели has_many :project_tasks).

Если вы настраиваете его правильно, можете ли вы предоставить полное представление и действие его контроллера?

person Regn    schedule 03.01.2017
comment
Я просто дважды проверил ассоциации, и они верны как для project.rb, так и для project_task.rb. Я не думаю, что проблема связана с представлением, поскольку оно показывает project_tasks (и я тоже могу их создать), но только это происходит только после того, как я добавил полную ссылку на задачи. Задачи project_tasks отображаются как частичные, например: ‹% = render @ project.project_tasks%› - person Charli Bregnballe; 04.01.2017
comment
Можете ли вы распечатать project_task.inspect над вашим link_to (внутри шаблона)? Посмотрите, подходите ли вы там. Кроме того, как получилось, что внутри вашего метода контроллера complete вы ссылаетесь на project.project_task, а не на @ project.project_task? (поскольку вы устанавливаете для своей переменной значение _ @ project_ в строке над ним) - person Matija Munjakovic; 04.01.2017
comment
Я получаю нужный объект с _@project_task.inspect: # ‹ProjectTask id: 1, title: wqeq, user_id: 1, project_id: 26, completed_at: nil, Что касается [email protected]_task, это одна ошибка! Я изменил его, чтобы вместо этого ссылаться на [email protected]_task, поскольку переменная экземпляра установлена ​​на текущий проект чуть выше в этом действии контроллера. Я думаю, что ошибка находится в link_to, но не во втором аргументе после пути, поскольку ошибка говорит, что project_task.id пуст. Я пробовал как с project.project_task.id, так и с @ project.project_task.id .. но безуспешно - person Charli Bregnballe; 04.01.2017
comment
Я изменил link_to на это: ‹% = link_to '', complete_project_project_task_path (@project, @ project.project_tasks), class: glyphicon glyphicon-ok, id: complete - # {project_task.id}, method:: patch%› Сейчас страница загружается, но ссылка выдает ошибку: не удалось найти ProjectTask с 'id' = # ‹ProjectTask :: ActiveRecord_Associations_CollectionProxy: 0x007f93788e9fc8› Интересно, как мне найти идентификатор project.project_task в действии контроллера? Поскольку это неверно @project_task = ProjectTask.find (params [: id]) - person Charli Bregnballe; 04.01.2017
comment
Если @project_task отображается правильно, почему бы вам не использовать его вместо project_task в своем link_to? Примерно так: <%= link_to '', complete_project_project_task_path(@project, @project_task), class: "glyphicon glyphicon-ok", id: "complete-#{project_task.id}", method: :patch %> Кстати, вы не должны использовать @project.project_tasks в своем link_to, так как вы даете массив объектов для действия complete вместо одного. - person Regn; 04.01.2017
comment
@project_task правильно не оказывающий в представлении. Я все еще получаю сообщение об ошибке с отсутствующим идентификатором. Я попробовал несколько вещей и заметил, что если я просто добавлю аргументы ‹% = link_to '', complete_project_project_task_path (@project, 1)%›, тогда он получит правильный путь в ссылке. (Но, конечно, это работает только для той, у которой идентификатор равен 1). За пределами link_to я могу получить идентификатор задачи, добавив ‹% = project_task.id%›, но внутри link_to это похоже на пустое или нулевое значение. Получаю проект _ @ без проблем. Путь правильный / project / 24 / project_task / XX, где XX отсутствуют - person Charli Bregnballe; 05.01.2017

Хорошо, я понял, в чем проблема.
У меня было 2 версии экземпляра @project_task, которые создали конфликт. (как из формы, так и из полного действия) Итак, я добавил

<% @project.project_tasks.select(&:persisted?).each do |project_task| %>

И исправление заключалось в том, чтобы добавить &: сохраняющийся? чтобы отображать только сохраненные объекты.

person Charli Bregnballe    schedule 09.01.2017