0

我有一个表单需要根据选择框中的不同选项进行更改。我需要的选择框有以下选项:Pay & Gifts(显示两个字段)、Pay Only(仅显示支付字段)、Gifts Only(仅显示礼物字段)。

这涉及 2 个属性,:pay 和:gifs。有没有办法让两个属性都有一个 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
})

但我不确定你的代码是否会像这样工作。您将选择框命名为“支付”,在下方有一个具有相同名称的文本字段。我认为第二个属性会覆盖第一个属性。此外,您的条件验证采用与条件相同的 lambda。因此,当满足该条件时,将验证这两个属性。但是我当然不知道完整的例子:-)。

于 2012-05-30T19:05:48.753 回答