2017-12-26 13 views
1

完了したタスクと実行するタスクのモデルがあります。ビューにはリンクがあり、リンクをクリックするとタスクをtodoからdoneに変更する必要があります。間違っているかを示すパスなぜリダイレクトが間違っていますか?

Started GET "/tasks/32" for 127.0.0.1 at 2017-12-26 11:59:06 +0200 
Processing by TasksController#show as HTML 
    Parameters: {"id"=>"32"} 
    Task Load (0.1ms) SELECT "tasks".* FROM "tasks" WHERE "tasks"."id" = ? LIMIT ? [["id", 32], ["LIMIT", 1]] 
    Rendering tasks/show.html.erb within layouts/application 
    Rendered tasks/show.html.erb within layouts/application (0.7ms) 
Completed 200 OK in 57ms (Views: 55.0ms | ActiveRecord: 0.1ms) 

にリダイレクトリンクをクリックしたときにそれは私のルート

get 'tasks/:id', to: 'tasks#change_to_done', as: 'change_to_done' 

私の見解

<% unless task.done %> 
     <td><%= check_box_tag "cb_tasks[]", task.id %></td> 
     <td><%= link_to task.title, task %></td> 
     <td><%= link_to 'Edit', edit_task_path(task.id) %></td> 
     <td><%= link_to 'Done', change_to_done_path(task.id) %></td> 
     <td><%= link_to 'Destroy', task, method: :delete, data: {confirm: 'Are you sure?'} %></td> 
     <% end %> 

と私のコントローラ

def change_to_done 
    @task = Task.find(params[:id]) 
    @task.done = true 
    @task.save 
    end 

ですか?フィールドの状態をfalseからtrueに変更するだけで済みます。

答えて

2

Railsルートは指定された順番で一致します。したがって、resources :tasksを超えると、'task/:id'を取得すると、リソース行のshowアクションのルートがget行の前に一致します。

には、例えば、エンドポイントを変更してください:

get 'change_to_done/:id', to: 'tasks#change_to_done', as: 'change_to_done' 
1

あなたのルートファイルでresources :tasksがある可能性があります。 Railsはこれを解決し、get 'tasks/:id', to: 'tasks#change_to_done', as: 'change_to_done'このルートを無視します。正確な動作を指定する必要がありますget 'tasks/:id/change_to_done', to: 'tasks#change_to_done', as: 'change_to_done'

関連する問題