2017-01-03 7 views
0

まずはお手伝いをしてくれてありがとうございます。必須キーがありません:ネストされた要素を更新する場合は[:id]

私はhas_many project_tasksというプロジェクトモデルを持っているプロジェクトツールに取り組んでいます。 project_tasksはプロジェクトに属します。

私はプロジェクトタスクのための完全なアクションとしてマークしようとしていますが、パッチアクションでproject_task idを取得できないようです。ここで

は私のルートです: (私はあまりにもプロジェクトのための完全な作用を有するが、それは働い罰金であることに注意してください)

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 

iを取得していますエラーがある: Noルート一致{:アクション=> "完全":コントローラ=> "project_tasks":ID =>ゼロ、:PROJECT_ID => "26"}必須欠落しますkeys:[:id]

link_toでは、2つの引数を追加するには、@ project(プロジェクトIDを取得する)とproject_task.idを追加します。 プロジェクトIDは正しく表示されていますが、project_task.idは表示されていないようです。 コントローラーのアクションを@project_task = ProjectTask.find(params [:id])に変更しようとしましたが、運が無難です。 (私はlink_toのいくつかの引数を使って試してみました) 私はそれを取得する方法がわかりませんが、あなたの1人が正しい方向に私を向けることを願っています。

ありがとうございます!

+0

'rake routes'の出力で質問を更新できますか? –

+0

はい、今更新されています。 –

+0

"complete_project_project_task_path(@project、project_task.id)"の代わりに、次のパス(link_toの内側)を指定するとどうなりますか "/projects/#{@project.id}/project_tasks/#{project_task.id}/完了? 同じエラーが表示されますか? – matija

答えて

0

さて、私は問題が何かを考え出しました。
2つのバージョンの@project_taskインスタンスがあり、競合が発生しました。持続:(フォームから、完全なアクションからの両方) だから私は

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

を追加し、修正が&を追加しましたか?保存されたオブジェクトのみを表示します。

0

ビューの変数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を考慮):あなたのコードでは、このような何かをする必要があります。

正しく設定している場合は、完全なビューとそのコントローラアクションを提供できますか?

+0

私はアソシエーションをダブルチェックしてproject.rbとproject_task.rbの両方で正しいことを確認しました project_tasksが表示されているので、問題はビューではないと思いますしかし、私はタスクに完全なリンクを追加した後にのみ発生します。 project_tasksは次のように部分的にレンダリングされます。 <%= render @ project.project_tasks%> –

+0

(テンプレート内の)link_toの上にproject_task.inspectを印刷できますか?そこに正しいオブジェクトがあるかどうか確認してください。 また、_complete_コントローラメソッドの中で、どうすれば_project.project_task_を参照していて、[email protected]_task_を参照していませんか? (あなたの変数を上の行の_ @ project_に設定しているので) – matija

+0

私は[email protected]_task.inspectで正しいオブジェクトを取得します:#