2016-08-16 10 views
1

Billモデルの入力を受け入れるフォームがあります。フォームには、トランザクションモデルで作成された動的配列の単語を提供するオートコンプリートがあります。私は、配列からの単語だけを入力として許可する検証を行いたいと思っています。私はvalidates_inclusion_ofのバリデーションを見つけましたが、これが適切なバリデーションであるかどうか、オートコンプリート用に作成された配列をチェックするためにバリデーションをモデルにリンクする方法がわかりません。入力がダイナミック配列の文字列と一致する場合にのみレールの検証

私の取引コントローラ内のルートはautocomplete_names

どのように検証が私の取引コントローラ内のルートに対する入力を確認することができますです。

ここまでの検証は間違ったコンテキストでこれを使用しており、カスタム検証を行う必要がありますか?

validates_inclusion_of :my_bill, in: [Transaction::autocomplete_names], :allow_blank => true, message: "Bill name not found in your account, please try again" 

これは間違っていると動作していないので、私は中に入れてかを把握する必要がある「:に」この検証のため

+0

あなたはどのバージョンのRailsを使用していますか? – Okomikeruko

+0

Railsを使用しています。4.0.10 – SupremeA

+0

Railsコンソールに 'Transaction :: autocomplete_names'と入力すると、出力はどうなりますか? – Okomikeruko

答えて

3

更新回答

次のようになります。

def self.autocompete_names 
    Transaction.all.pluck(:trans_name) 
end 

その後、あなたのビル・モデルでは、次の検証を使用することができます。

validates :my_bill, inclusion: { in:   Transaction.autocomplete_names, 
           allow_blank: true, 
           message:  "Bill name not found in your account, please try again" } 

あなたは私たちですRails 4では、検証のための上記の構造がより最新のものだと私は信じています。

1

は、名前の配列を返しますTransactionでクラスメソッドを作成します。そして、この方法をvalidates_inclusion_ofで呼んでください。

def self.autocomplete_names 
    # return an array of words matching bills associated with the user's account 
end 

のようなものを見て、その後の検証で、それを利用する必要があるクラスのメソッドを追加します。

ドキュメントから
validates_inclusion_of :my_bill, in: Transaction.autocomplete_names 

:allow_blankオプションは次のようになります。allow_nilオプション。このオプションは、属性の値が空白の場合に検証をパスさせます。たとえば、nilや空の文字列などです。

検証からallow_blankオプションを削除します。あなたの検証があなたのトランザクションモデルに次のように書くことができ

validates_inclusion_of :my_bill, in: Transaction.autocomplete_names, message: "Bill name not found in your account, please try again" 
0

検証にコントローラアクションを使用することはできません。コントローラーアクションは、データを操作して応答を戻すためのものです。彼らはあなたのモデルで定義されたメソッドとは異なります。

を検証する文字列の配列を返す、Transactionクラス内のメソッドが必要です。このような何か:

class Transaction 
    def self.autocomplete_names 
    # return that array of strings 
    end 
end 

Billの内側にあなたのようにあなたの検証を変更する必要があります

class Bill 
    validates_inclusion_of :my_bill, 
         in: -> { Transaction::autocomplete_names }, 
         allow_blank: true, 
         message: "Bill name not found in your account, please try again" 
end 

検証内部ラムダ->の使用に注意してください。それを使用しない場合、文字列の配列はクラス定義時にのみ評価されます。しかし、この検証を実行するたびにデータベースからの実際のデータが必要です。だから、それはラムダでなければなりません。構文についてはわかりません。試してみてください。

ブランク値をmy_billのデータベースに格納しない場合は、allow_blankの部分を削除することもできます。

関連する問題