2011-04-13 6 views
0

私はレール2.3を使用しています。テキストボックスに入力されたレール関連モデルを検証する方法

テキストボックスを使用して入力されたbelongs_to関連フィールドを検証するにはどうすればよいですか?例えばブログ投稿はカテゴリに属しますが、selectを使用して入力されるのではなく、テキストボックス内のカテゴリ名(一意であると仮定します)として入力されます。

考えられるエラーは次のとおりです。フォーマットが間違っていて、DBにそのようなカテゴリがありません。

アソシエーションに直接文字列を割り当てると、AssociationTypeMismatchでエラーが発生するので、同じアトリビュートにアサインすることができず、カスタムbefore_validateメソッドを使用できません。

コントローラの変換作業をモデルのエラーコレクションに追加しても、まだ保存されています(検証が開始される前にエラーコレクションがクリアされていると思います)。

標準のエラーコレクションを使用するにはどうすればよいですか?

+0

カテゴリフィールドのデータタイプは何ですか? –

+0

@Michaelフィールドが参照(整数)の場合、入力は文字列です。 – lmz

答えて

0

javascriptのオートコンプリート機能を備えたダミーのテキストボックスの使用を検討してください。その関連付けのIDのフォームに非表示のフィールドを配置します。 JSが一致のリストを返すときに、IDが含まれ、アイテムが選択されたときに隠れたIDフィールドが設定されます。

そうしないと、これが役立つ可能性があります。これはテストされていないコードです。

# Assumed that "Obj" is the class of your belongs_to association 

attr_accessor :obj_name 
def obj_name= value 
    self.obj = Obj.find_by_name(params[:obj_name]) 
end 

validate :validate_obj 
def validate_obj 
    # If there's no obj, report an error on our pseudo-field 
    return if self.obj.present? 
    return if self.obj_name.blank? # Allow empty object if blank name was specified 
    error.add(:obj_name, "does not appear to be a valid obj name") 
end 
+0

"no object"/nilも有効な値であることを除いて、これは意味があります。助けにならない。私は、ここで別の属性(attr_accessorを使って作成された属性ですか?)が必要だと思っています。ユーザーが入力した文字列を格納し、オブジェクトをvalidateで解決するだけです。 – lmz

+0

attr_accessorを使用するのは良い方法です。実際の属性を設定するには、get_id_from_nameのようなセッターをオーバーライドしてください。ヌル値を許可するように編集しました。 – aceofspades

関連する問題