BLogみんなのウェディングのエンジニア。聴いたお話をまとめておく倉庫的な。Railsにて、検索フォームを使用した際に、受け渡す値にvalidationを加えたい時、ありますよね。form_forやform_tagを使用した際のクエリ,パラメータにvalidationを加える方法を書きます。Formオブジェクトというデザインパターンのひとつです。RailsTutorialを絶賛挑戦中や、終わってから少し応用的なことをしている人は同じようなことで困っているかと思います。参考にになれば幸いです!おおまかな流れmodelによるvalidationを利用するため、フォーム用のクラスを作成する。クラスにvalidationを記述しておくコントローラ内で作ったクラスをインスタンス化させる時に引数として渡してvalidationを適用させるといった流れですね。%>このコードでは、以下のコントローラで定めたUserのモデルオブジェクトを使用したformを作成しています。@userに対して働きかけが行うようにしているといったものです。@userはmodelであるUserからインスタンス化したものです。endendここで、validationがかかるタイミングはmodelを作成しようとした時です。上記のmodelのUserをみてみましょう。ActiveRecordを継承して作成しています。ActiveRecordを継承して作成したmodelオブジェクトは、簡単に言えばDBとやりとりを行うmodelとなります。modelでは、createやnewを行うタイミングでvalidationが適用されます。trueの部分ですね。name属性(変数)は、空はだめですよ、といっています。modelオブジェクトを使えばvalidationをさせる仕組みは揃っているということです。今回のparams[:keyword]のような一時的な値の受け渡しにおいていちいちDBに保存していると時間がかかってダメです。そこで、一時的に格納するオブジェクトを作成することで解決させます。以下のようなclassを新たにapp/models/の中に作成します。クラスの名前、attr_accessorの変数名は各自で設定してください。クラスにおける変数としてattr_accessorで定義します。}のようにvalidationを追加してもよいでしょう。ここでポイントは2点です。ActiveModel::ModelActiveRecordを継承しないのは、DBとやりとりをしないclassであるととらえておいて問題なさそうです。ActiveModel::Modelについても、このように記述すると思っておきましょう。詳しくは追加でググりましょう。これでmodelを用意することができました。あとはこちらのクラスを使ってインスタンス化を行えば自動的にvalidationがされるはずです。コントローラ内にてこんな感じになると思います。SearchFormのクラスは作ってあるため、コントローラで使えます。params[:search_keyword])newしてあげる時にparamsで値をkeywordに入れてあげましょう。この時にvalidationが行われます。consoleを用いてvalidationに応じていろいろと値を入れてみて試すとvalidationが行われているか確かめることができます。"aaaaaaa")>word.valid?長さのvalidationをかけているならこんな感じですね。"")空白をチェックするならこんな感じ。これでvalidationが適用されることになったので、あとはインスタンス変数の(この場合は)wordを使いましょう。params[:keyword]としていたところをwordを使ってあげるとOKです。(1)スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。