忘れたときはここを見ろ。この広告は、90日以上更新していないブログに表示しています。その3RoR前回まではフォーム専用の代理クラスを作っていたが、特異メソッドを加えることでモデルにない属性をフォーム入力項目にしてしまえるもう一つの方法があるので記しておく。Notes特異メソッドとは、簡単にいえば、インスタンスに追加されたメソッドである。任意のインスタンスに、そしてそれ以外のクラスや他インスタンス等に何の影響もなく、メソッドが動的に加えられるのである。この特異メソッドでフォームだけで使う属性のアクセサーメソッドを登録してしまうというのうが今回の方法である。住所録のAdressBookなるモデルがあって、その属性値がaddress、フォームでは都道府県のstate、市区町村のcity、そして町名字番地等のstreetを入力させ、半角空白文字でつないでadddressに一旦格納したのちにDBで永続化されるとしよう。この例では、付け加えた属性しかフォームで利用していないが、元々モデルにある属性もフォームのフィールド(入力項目)として並列利用できることを明確にしておく。モデルインスタンス(オブジェクト)自身にインスタンス変数、そのアクセサー、そして必要があればバリデーションを実行させるメソッドを加える。street)から半角空白文字で繋げた文字列を生成するクラスメソッド(get_address_from)も加えている。endendself.singleton_class.class_evalが肝心なところでる。class_evalではなくinstance_evalを使いたいところだが、singleton_class(特異クラス)を態々呼び出して特異メソッドを定義させている。このあたりは、もっと詳しく理解して記しておくべきだが、後日にする。今はこのやり方で多くの場合に対応できるはずだ。このメソッドを何回実行しても登録されるのは最初の一回だけであり、2回目以降はエラーは出ない。エンジニアは空を飛ぶインスタンス変数とそのアクセサーが要らなくなったら因みに、必要が無くなったらremove_methodとremove_instance_variableを使って加えたメソッドやインスタンス変数を削除することができる。フォーム用に使う場合は、殆どの場合、そうする必要はないだろう。バリデーションを削除したい場合は・・・後日にする。最初にscaffoldで生成していたとすると、手を加えるのは_form.html.erbだけで済み、前回までの方法より手間が少ない。%>尚、上記のコードにはscaffoldで生成したaddressはコメントアウトして残してある。コントローラーフォーム専用の属性を加えた属性間の情報受け渡し時のフィルタリング/コンバート処理や、ストロングパラメーターの処理をそれ用に変更するだけで、ロジックは変わりがなく、この点も前回までの専用のクラスを用意するよりは簡便である。»プロフィールid:Matthew忘れたときはここを見ろ。(1)リンクはてなブログブログをはじめる週刊はてなブログはてなブログProはてなブログをはじめよう!Matthewさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。