form_forの構造でわからない箇所があります。
Railsのscaffoldでアプリを生成するとeditとnewで
共通の_form.html.erbを利用しています。
submitを押したときの挙動がそれぞれcreateとupdateで分岐する仕組みがわかりません。
どのようにして制御されているのでしょうか
初歩的な部分で恐縮ですが宜しくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
create と update の呼び出しはconfig/routes.rb
のルーティング設定で決定されます。
ルーティング情報は以下のコマンドで確認できます。
sh
1$ rake routes
表示例
text
1 Prefix Verb URI Pattern Controller#Action 2 posts GET /posts(.:format) posts#index 3 POST /posts(.:format) posts#create 4 new_post GET /posts/new(.:format) posts#new 5edit_post GET /posts/:id/edit(.:format) posts#edit 6 post GET /posts/:id(.:format) posts#show 7 PATCH /posts/:id(.:format) posts#update 8 PUT /posts/:id(.:format) posts#update 9 DELETE /posts/:id(.:format) posts#destroy
submit したときの遷移先のURIパターンとHTTPメソッド(上記のVerb列)で、呼び出されるコントローラのメソッドが決定されます。
createが呼び出されるまで
- ブラウザで /posts/new にアクセス(GET /posts/new)
- posts#new メソッド呼び出し
- app/views/posts/new.html.erb 呼び出し
⇒ app/views/posts/_form.html.erb 呼び出し - ブラウザに新規登録画面表示
html
1<form class="new_post" id="new_post" action="/posts" accept-charset="UTF-8" method="post">
- submitボタンを押す(POST /posts)
- posts#create メソッド呼び出し
updateが呼び出されるまで
- ブラウザで /posts/edit にアクセス(GET /posts/1)
- posts#edit メソッド呼び出し
- app/views/posts/edit.html.erb 呼び出し
⇒ app/views/posts/_form.html.erb 呼び出し - ブラウザに編集画面表示(methodがPATCHになるはずだと思ったのですが、自分の環境ではPOSTになっていました。)
html
1<form class="edit_post" id="edit_post_1" action="/posts/1" accept-charset="UTF-8" method="post">
- submitボタンを押す(POST /posts/1)
- posts#update メソッド呼び出し
まとめ
- form_forに渡す@postのidが設定されているか(新規 or 編集)でformタグのaction属性が変化する
- formタグのaction属性のパターンによりsubmit時に呼び出されるコントローラのメソッドが変化する
投稿2016/06/01 12:39
総合スコア1800
0
form_forの引数のモデルに対して
new_record?
というメソッドをじっこうした結果で分岐しています。
投稿2016/06/01 11:55
編集2016/06/01 11:57総合スコア265
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/02 02:28