0

選択ボックスのさまざまな選択肢に基づいてフォームを変更する必要があります。必要な選択ボックスには、次のオプションがあります: Pay & Gifts (両方のフィールドが表示されます)、Pay Only (支払いフィールドのみが表示されます)、Gifts Only (ギフト フィールドのみが表示されます)。

これには、:pay と :gifts の 2 つの属性が含まれます。両方の属性に対して 1 つの f.collection 選択ボックスを持つ方法はありますか? おそらくjqueryを使用してフォームフィールドを表示および非表示にする必要があることはわかっていますが、フィールドは選択に基づいて必須(validates_presence_of)です...これを行う方法に関する提案はありますか?

_rewards_step.html.erb

<h2>rewards</h2>

  <p>
<%= f.collection_select :pay, Upload::REWARDS, :to_s, :to_s %>
  </p>
  <p id="payfields">
    <%= f.label :pay %><br />
    <%= f.text_field :pay %>
  </p>
  <p id="giftsfields">
    <%= f.label :gifts %><br />
    <%= f.text_field :gifts %>
  </p>

アップロード.rb

class Upload < ActiveRecord::Base
attr_accessible :pay, :gifts
attr_writer :current_step

validates_presence_of :pay, :if => lambda { |u| u.current_step == "rewards" }
validates_presence_of :gifts, :if => lambda { |u| u.current_step == "rewards" }

REWARDS = ['Pay & Gifts', 'Pay Only', 'Gifts Only']  
4

2 に答える 2

1

テキストとしての選択と入力の両方に支払いフィールドを使用しています。おそらく良くないでしょう。選択するための追加フィールドを作成することをお勧めします。仮想属性のみで十分であり、データベースに格納する必要はありませんが、検証には必要になります。

フィールドを非表示にする jQuery 部分:

$("#rewards").change(function(){
  if ($("#rewards").val()=="Pay Only") {$("#gift_field").hide(); $("#pay_field").show(); }
  if ($("#rewards").val()=="Gift Only") {$("#gift_field").show(); $("#pay_field").hide(); }
  if ($("#rewards").val()=="Pay & Gift") {$("#gift_field").show(); $("#pay_field").show(); }
})

もちろん、ID と値をコードに合わせて調整する必要があります。

検証部分は、:if

attr_accessor :reward_type
validates_presence_of :pay, :if => lambda { |u| u.current_step == "rewards" && reward_type != "Gift Only" }
validates_presence_of :gifts, :if => lambda { |u| u.current_step == "rewards" && reward_type != "Pay Only" }

これはソリューションの骨組みにすぎません。考えてみてください。

于 2012-05-30T19:07:42.413 に答える
0

うーん、一般的に言えば、そうです。選択ボックスでの選択に基づいて、javascript を使用して DOM を更新する必要があります。選択ボックス自体の「変更」イベントにバインドできます。何かのようなもの:

$('select#my_select_box_id').change(function(){ 
  //take a decision based on $(this).val()
  $('p#giftsfield').show()  //or hide based on what you want
})

しかし、あなたのコードがこのように機能するかどうかはわかりません。選択ボックスに「pay」という名前を付けて、その下に同じ名前のテキスト フィールドがあります。2 番目の属性が最初の属性を上書きすると思います。さらに、条件付き検証は条件と同じラムダを取ります。したがって、その条件が満たされると、両方の属性が検証されます。しかし、もちろん、私はその例を完全には知りません:-)。

于 2012-05-30T19:05:48.753 に答える