2011-02-01 8 views
0

私はいくつかのビジネスルールを持つ製品コンフィグレータを構築しようとしています。 私は2つのモデルを持っています。一つは製品、もう一つはコンポーネントです。製品には多くのコンポーネントがありますが、同じコンポーネントを異なる製品で使用することができます。トリガーのあるネストされたフォーム

私は

--inコントローラをモデルとの関係などを持っており、製品のコントローラで私のショーのビューを構築しようとしている

def show 
@product = Product.find(params[:id]) 
@productelements = Product.find(params[:id]).elements 
end 

--inビュー

<% @productelements.each do |p| %> 
    <li><%= p.name </li> 
    <li><%= p.quantity </li> 
<% end %> 

ので、はるかに良い、それは特定のルールを保持する必要があることを除いて。これは、コンピュータのような製品を に設定できるようにするためです。数量はユーザ定義(ある場合)ですが、 他の要素に影響する可能性があります。

Element Quantity 
Processor A 1 
RAM in GB  2 
HDD Type B  2 

ユーザーがプロセッサBにプロセッサを変更することができますが、この場合はHDDの数量は、これは単なる説明することである1に変更する必要があります。たとえば、私は以下の持っている場合。 - 要素をフォームにループする方法を説明しています。 - このループを要素にフォームにラップします。 - 変更に応じてフォームを作成し、必要な場所で検証および調整する関数を呼び出します。 - 検証されたフィールドで製品をレンダリングします。

アドバイスはありますか?あるいは、アプローチが現実的ではないかもしれませんか? 多くの製品とルールがあることを覚えておいてください。コントローラの中にケースステートメントを作成したくありませんでした。

ありがとうございます!

答えて

0

OK、上記のコードを最初に修正するには、同じ製品を2回ニードルで検索しています。最初のコードブロックの代わりに、次のようにしてください:

def show 
    @product = Product.find(params[:id]) 
    @productelements = @product.elements 
end 

ご覧のとおり、2番目のfind()呼び出しを置き換えました。

あなたのもっと大きな質問に、私はあなたがこれを思い知らされていると思います。コンポーネントに関連付けられたビジネスルールがある場合は、lib /ディレクトリに格納されているモジュール内のルールを表現し、そのモジュールをProductモデルに組み込みます。このようにして、フォームのコンテキスト外でビジネスルールをテストして、正しいと判断することができます。

次に、テスト済みのルールをフォームのカスタム検証として使用できます。したがって、あなたの例では、ユーザーがCPU AをCPU Bに変更したが、HDDの数量を間違えた場合、バックエンドの検証がこれをキャッチしてフラグを立てます。

この検証は、ajaxを介してフロントエンドに公開して、より滑らかなUIが得られますが、一度に1つのことが可能です。

意味がありますか?

+0

意味があります、ありがとうございます!私は次のことについて少し心配しています。必ずしもユーザーがHDDに必要な数量を入力する必要はなく、変更に依存するフィールドを自分で調整してください。このように、私はこれを行う唯一の方法は、フォームからのタグを使用してJavaScript上になることを理解しています。しかし、これもまた、ページのソースコードを見ることができる誰もが自分の設定ルールを公開します。とにかく、フォーム呼び出しを変更時に行うようにして、もう一度レンダリングしますが、今回はDBに問い合わせることなくですか?さもなければ、私は同じデフォルトビューを得ることになりますか? – Lievcin

+0

ビジネスルールはデータベースではなく、モジュール内に存在するため、残ったフィールドの値に基づいて値を調整するために簡単にajax呼び出しを行うことができます。この方法では、クライアント側には存在しないため、データベースを照会する必要はありません。 –

+0

あなたの答えSrdjanに感謝します。これがどのように行われているかを確認するためにお勧めできるリソースはありますか?私はモジュールメソッドと結果へのajax呼び出しを意味しますか? – Lievcin

関連する問題