2012-04-03 3 views
0

AとBの2つのタイプを持つモデルを考えてみましょう。どちらのタイプも色を文字列として保存します。タイプAは青色または赤色でよい。タイプBは、白または黒でよい。Railsで少し異なるフォームを使ってモデルを操作するには?

タイプAのフォームを表示する場合、[青、赤]を含むHTML選択リストがあります。タイプBの場合、選択リストには[白、黒]が含まれます。

同じモデルに対してこれら2つの異なる選択肢を表示する最良の方法は何ですか?

新しいモデルを作成するときにタイプがないため、タイプを切り替えることができません。

各タイプに1つずつ、2つの作成ボタンが必要ですか?あるいは、共通の基底モデルから継承した2つの別々のモデルとして設計する必要がありますか?

タイプの選択に基づいてselectのAJAX(jQuery)アップデートを検討しました。これは単純な問題に対する非常に複雑な解決策のようです。

+0

2つのモデルが必要ですか(各タイプの機能は異なりますか?)検証の問題(タイプによって制限される色)の場合は、このロジックをモデルに入れて競合の検証エラーを強制することができます。ユーザーの観点からは、[change()](http://api.jquery.com/change/)ハンドラがあれば便利です。 – RobinGower

+0

いいえ、機能は非常に似ているので、私は1つのモデルが良いと思います。 –

答えて

1

カラータイプの制限を強制するには、モデルの検証で行う必要があります。あなたのモデルとビューを一致させるために、私は少しのjavascriptを提案します:

<select class="type-select"> 
    <option value="TypeA">Type A</option> 
    <option value="TypeB">Type B</option> 
</select> 

<select class="type-A-opts"> 
    <option value="blue">Blue</option> 
    <option value="red">Red</option> 
</select> 
<select class="type-B-opts" style="display:none" > 
    <option value="black">Black</option> 
    <option value="white">White</option> 
</select> 

<script> 
    $(".type-select").change(function(){ 
    var cur_value = $(this).attr("value"); 
    if(cur_value == "TypeA"){ 
     $(".type-A-opts").show(); 
     $(".type-B-opts").hide(); 
    }else{ 
     $(".type-A-opts").hide(); 
     $(".type-B-opts").show(); 
    } 
    }); 
</script> 
1

私はoptgroupを提案します。

<select> 
    <optgroup label="type A"> 
    <option value="blue">Blue</option> 
    <option value="red">Red</option> 
    </optgroup> 
    <optgroup label="type B"> 
    <option value="black">Black</option> 
    <option value="white">White</option> 
    </optgroup> 
</select> 
+0

それはいいですが、タイプに適切な色を適用する方法は? –

+0

各色は、タイプAまたはタイプBのいずれかに属します。指定された色のタイプは間違いなく知っています。 – Yanhao

関連する問題