Railsコントローラーの例を見ると、通常、次のようなものが表示されます。
class WidgetController < ActionController::Base
def new
@widget = Widget.new
end
def create
@widget = Widget.new(params[:id])
if @widget.save
redirect_to @widget
else
render 'new'
end
end
end
これは機能しますが、いくつかの問題があります。
ルート
ウィジェットをroutes.rbファイルに追加した場合:
Example::Application.routes.draw do
resources :widgets
end
GET /widgets/new
にルーティングされnew
、POST /widgets
にルーティングされcreate
ます。
ユーザーが新しいウィジェットページに誤った情報を入力して送信すると、ブラウザに。が付いたURLが表示/widgets
されますが、新しいテンプレートはレンダリングされます。ユーザーがページをブックマークして後で戻るか、ページを更新すると、新しいアクションの代わりにインデックスアクションが呼び出されますが、これはユーザーが期待するものではありません。インデックスアクションがない場合、またはユーザーにインデックスアクションを表示する権限がない場合、応答は404になります。
コードの複製
不自然な例として、新しいメソッドにトリッキーなロジックがあったとしましょう。
def new
@widget = Widget.new
do_something_tricky()
end
new
現在のアプローチを使用して、そのロジックをとに複製しcreate
ます。new
から呼び出すこともできますが、定義されているかどうかを確認create
するために変更する必要があります。new
@widget
def new
@widget ||= Widget.new
do_something_tricky()
end
さらに、これはコントローラーのアクションの直交性を低下させるため、間違っていると感じます。
何をすべきか?
では、この問題を解決するRailsの方法は何でしょうか。new
新しいテンプレートをレンダリングする代わりににリダイレクトする必要がありますか?new
中に電話する必要がありcreate
ますか?私はそれと一緒に暮らすべきですか?もっと良い方法はありますか?