忘れたときはここを見ろ。この広告は、90日以上更新していないブログに表示しています。その1RoRRoRでサイトを構築していると、DBのテーブルに存在しないか、テーブルにカラムがない項目を入力して何かさせたくなることがある。検索機能はその一つであろう。その方法は既に沢山の方によって英語や日本で紹介されている。次はその一つ:qiita.com検索機能を実装するならこれでよいが、CRUDを実装するには情報が不足している。詳細に言うなら、更新(Update)が思った通りにならない。更新できず、意図しないルーティングに悩まされることだろう。ソースレベルでいうと、フォームを更新のつもりで生成させたのに新規作成で生成してしまう。更新フォームを生成させるには、モデルにpersisted?という永続化フラグを返すメソッドが存在してその返す値がtrueでなければならない。これはRailsのソースプログラムを読んで判明した情報だ:github.comform_helperソースコードの462行*2に更新(edit)か作成(new)かを振り分ける条件が書いてあり、persisted?メソッドが存在していて*3なおかつ返す値がtrueであるときに更新とする処理が書かれている。上記に挙げたMVC例では、フォーム用のモデルNameFormにpersisted?メソッドを加え、その値を保持するためのインスタンス変数を加えてやればよい。endendさらに、呼び出すコントローラー側でフォーム用のモデルのpersistedにtrueを与えて更新(edit)に、falseを与えて新規作成(new)に振り分ける処理を加えることで、更新も可能となる。endend実際に更新と作成のフォームが振り分けられているかどうかは実行してブラウザでソースをみればよい。5.0以上で確認した。追記この方法を使う場合、form_forに渡されるオブジェクト/インスタンスに新規か更新かを判断するための属性が全く含まれていないので、:urlの:actionを指定しないとエラーとなります。この方法を使う場合は:urlの:actionを指定します。*1:フォームが新規作成用で生成され、更新ボタンを押してもコントローラーのcreateを実行しようとし、ルーティングによってはエラーダンプ表示となる。*2:2017/05/16日時点*3:respond_to?で調べることができる。»プロフィールid:Matthew忘れたときはここを見ろ。(1)リンクはてなブログブログをはじめる週刊はてなブログはてなブログProはてなブログをはじめよう!Matthewさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。