2011-01-25 1 views
3

処理のためにかなり多くのパラメータがコントローラに渡されたフォームがあります。異なるが、paramsを同様の方法で命名されているの「設定」:今すぐRails:パラメータハッシュを動的に反復して、それらが存在することを確認します。

setname1_paramname 
setname1_paramname2 

、私はすべてのフィールドが提出されていることを確認するためにこれらの「セット」のいずれかをチェックする必要があります。今、私は、またはスタイルの文の場合は、手動でこれをやっている:

if setname1_paramname.blank? || setname1_paramname2.blank? || ...etc 
    @object.errors.add_to_base("All setname1 fields are required."). 
    render :action => 'new' 
    return false 
end 

は、これらのparamsを超えるプログラムでループにそこの方法です、と@objectエラーに追加しますか?

ありがとうございます!

+0

有用であることを見つけるかもしれあなたのparamsはありますかシリーズのような論理的な順序?他の言葉では、次のものはsetname1_paramname3とsetname1_paramname4のようです。 – apneadiving

+0

残念ながらこれは課金情報なので、billing_address、billing_stateなどのようになります –

+2

あなたのコントローラでそれを行うことは、実際にはお勧めできません。あなたのビジネスロジックをあなたのモデル**に残すことは**推奨されます**。 – edgerunner

答えて

9

あなたは大量のパラメータを持っているように思えますし、パラメータのグループをチェックする必要があるように思えるかもしれません。基本的には、paramsハッシュを繰り返し、正規表現を使用してパラメータのセットをターゲットにします。次に、ループ内で、あなたが検証の任意の並べ替えを行うことができます。

params.each do |key, value| 
    # target groups using regular expressions 
    if (key.to_s[/setname1.*/]) 
    # whatever logic you need for params that start with 'setname1' 
    if param[key].blank? 
     @object.errors.add_to_base("All setname1 fields are required."). 
    end 
    end 
end 
+0

また、レール 'starts_with?'を使用できますか?文字列メソッドはここに? –

+1

うん、私はそれがうまくいくと思います。 'active_support 'を要求してから' active_support/core_ext'を要求し、 '' test123 ".starts_with?(" test ")'#=> trueを実行して、irbでテストしました。そして、 '' test123 ".starts_with?(" false ")'#=> false – Upgradingdave

1

一時的であってもこの情報をモデルに保存するだけでなく、あなたの情報にレール検証を使用するだけの理由はありますか?

+0

私はモデルのロジックを保つことを望んでいますが、これらの特定のフィールドの存在を、そのプロセスのずっと前まで、問題のモデルを保存することなく、さらなるアクションの「ゲートウェイ」として検証する必要があります。残念ながら、私は継承されたコードで作業しており、プロセスをあまりにも変更することはできません。 –

+0

これ以上のアクションはありますか?これはあなたがモデルに保存することができるものなのですか?モデルが保存されていれば、さらなるアクションが第2段階のオプションとしてストールしていますか?たとえば、モデルを保存して、編集ページにリダイレクトします。情報がチェックアウトされている場合は、編集ページから別のフォームまたは一連のアクションが表示されます。 –

+0

モデル**はバリデーションに失敗した場合、**保存しません。 – edgerunner

6

名前が任意で、自分が選択したものであれば、モデルで仮想属性を作成し、Railsに存在チェックを処理させることができます。

class SomeModel < ActiveRecord::Base 
    VIRTUAL_ATTRIBUTES = [:billing_address, :billing_state, :something_else] 
    attr_accessor *VIRTUAL_ATTRIBUTES 
    validates_presence_of *VIRTUAL_ATTRIBUTES 
    … 
end 
+0

非常にエレガント:) – apneadiving

0

私はさびが、私は値がブランクであっても、paramはまだであれば、はい、フォーム要素から来ているようparamsハッシュに返されることを想定?あなたは単にparamsハッシュを繰り返し、空白でない値の数のカウンターを保持し、paramsハッシュの長さをカウンターと比較できますか?カウンタが短い場合は空白のパラメータがあり、個々のパラメータのチェックをハードコードすることなくエラーを処理できますか?

関連する問題