我的表单需要根据选择框中的不同选项进行更改。我需要的选择框有以下选项: 付费&礼物(显示两个字段), 仅付款(仅显示付款字段), 仅限礼品(仅显示礼品栏)。
这涉及2个属性:pay和:gifts。有没有办法为两个属性都有一个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>
upload.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']
答案 0 :(得分: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" }
这只是解决方案的一个框架,请考虑一下。
答案 1 :(得分: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”,而在下方则是一个具有相同名称的文本字段。我认为第二个属性将覆盖第一个属性。此外,您的条件验证采用与条件相同的lambda。因此,当满足该条件时,将验证这两个属性。但当然我完全不知道这个例子: - )。