2


0

Rails 3、カスタムアクション、およびHTMLリクエストメソッド

私は、カスタムコントローラーアクションでリンクを使用するか、フォーム/ボタンを使用するか、「ポスト」対「取得」対「プット」リクエストを使用することの長所と短所を本当に理解していません。

そこで、タスクとタスクコントローラーを含む簡単なTo Doリストがあり、dbで特定のタスクを見つけてそのステータス属性を「incomplete」から「complete」に更新する「complete」アクションが必要だとしましょう。

def complete
  @task = Task.find(params[:id])
  if @task.update_attributes(:status => "complete")
    redirect_to tasks_url, :notice => "Completed!"
  else
    redirect_to tasks_url, :error => "Whoops."
  end
end

このルートを定義するためのベストプラクティスの方法は何ですか、どのHTMLリクエストメソッドを使用する必要がありますか? put? get?)、プレーンリンクまたはフォームを使用する必要がありますか? (および注意:ユーザーのセキュリティモデルはすべてdeviseで計算され、フィルターなどの前に適切であると仮定します。)

そして何よりも、これをすべてRails 3のroutes.rbファイルで明確に表現するにはどうすればよいでしょうか?

以下のコードは実際には機能していませんでした:

#routes.rb
resources :tasks do
   members do
     post 'complete'
   end
end

したがって、現在私はこれを代わりに使用しています:

#routes.rb
match 'tasks/:id/complete', 'tasks#complete', :as => "complete_task"

#view
= link_to "Complete", complete_task_path(:id => @task.id)

しかし、これはget要求をトリガーし、「put」または「post」である必要があるように感じます。または、それはまったくリンクする必要がありますか? 非表示フィールドを持つフォームである必要がありますか?

1 Answer


2


「link_to」メソッドは通常、アンカータグ、つまり「」、つまり通常のGETリクエストを生成します

link_toを使用してPOSTリクエストを行うには、次を実行する必要があります

= link_to "Complete", complete_task_path(:id => @task.id), :method => :post

ブラウザでJavaScriptが無効になっている場合、上記のステートメントはPOSTではなくGETリクエストにフォールバックすることに注意してください。