如何使这些变量“必需”

时间:2015-09-18 21:59:25

标签: ruby-on-rails ruby forms validation ruby-on-rails-4

<%= form_for @organization do |f| %>
  <%= render partial: 'shared/error_messages', locals: { object: f.object } %>

  <label id="icon" for="country"></label>
  <%= f.select :country, [['Afghanistan', 'AF'],
                          ['Albania', 'AL'],
                          # etc.,
                          ['Zimbabwe', 'ZW']
                         ], {:prompt => 'Please select location', required: true} %>

  <label id="icon" for="id_number"></label>
  <%= f.text_field :id_number, placeholder: 'e.g.: 123abc' %>
  <%= f.check_box(:no_id) + "&nbsp <i>No ID</i>".html_safe %>
<% end %>

在注册表单中,我有上面的代码。如何为此表单实现以下目标?

1)如何使country成为必需?除非required: true选择了国家/地区,否则它目前接受它。也许它也会看到&#34;请选择位置&#34;作为价值?

2)如何要求输入id_number或选中no_id的复选框,并且无法同时使用。我希望这种形式以及模型级别的要求。

更新:我在下面添加了第二项要求的模型验证,这似乎有效:

validate  :id_or_no_id

def id_or_no_id
  if (self.id_number.nil? || self.id_number.empty?) && self.no_id != true
    errors.add(:id_number, "Need id or need to select checkbox")
  elsif (self.id_number && !self.id_number.empty?) && (self.no_id && self.no_id == true)
    errors.add(:id_number, "Can't have both id and checked checkbox")
  end
end

如何让country的表单验证生效?如果我将f.select的最后一行更改为], {}, {:required => true, :placeholder => 'Select your location...'} %>,则会在下拉框的顶部(因此占位符不起作用)如果没有选择国家/地区,则表单验证的工作原理是它要求选择国家/地区。但现在占位符还没有工作......

1 个答案:

答案 0 :(得分:1)

确保您的模型有验证

class Model
  validates :country, presence: true
  validates :id_or_no_id
  private
  def id_or_no_id
    if #custom logic here#
      errors.add :some_field, "you must have a valid id or no id"   
    end
  end
end

修改

根据您的编辑,您的功能应如下所示,以便更好地进行编码  (这也是丑陋的代码)

validate  :id_or_no_id
def id_or_no_id
  if (id_number.nil? || id_number.empty?) && !no_id
    errors.add(:id_number, "Need id or need to select checkbox")
  elsif (id_number && id_number.present?) && no_id
    errors.add(:id_number, "Can't have both id and checked checkbox")
  end
end

也许这也有效

validate :use_one_id

def use_one_id
  if !id_number && !no_id
    errors.add :id_number, "you must select one...."
  end

  if id_number && no_id
    errors.add :id_number, "can't select both"
  end
end