Rails 4:自定义表单构建器复选框

时间:2014-08-20 11:34:36

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

我有一个表单构建器帮助方法:

 def check_box(attribute_name, *args)
    @template.content_tag 'label', class: 'checkbox', for: "#{@object_name}_#{attribute_name}" do
      super(attribute_name, *args) + @template.content_tag('i') +
          @object.class.human_attribute_name(attribute_name)
    end
  end

这将生成嵌套HTML:

<label class="checkbox" for="application_setting_alert_on_click_link">
<input type="hidden" value="0" name="application_setting[alert_on_click_link]">
<input id="application_setting_alert_on_click_epay_link" type="checkbox" value="1" name="application_setting[alert_on_click_link]">
<i></i>
When customer visits link
</label>

但是通过W3C验证器,我们在标签内不能有2个输入,因此,我希望将隐藏的输入取出并放置在标签之外:

<input type="hidden" value="0" name="application_setting[alert_on_click_link]">
<label class="checkbox" for="application_setting_alert_on_click_link">
    <input id="application_setting_alert_on_click_epay_link" type="checkbox" value="1" name="application_setting[alert_on_click_link]">
    <i></i>
    When customer visits link
 </label>

任何帮助?

1 个答案:

答案 0 :(得分:1)

使用这些check_box并不容易。您需要告诉rails不要包含隐藏字段并自行添加(未经测试):

  def check_box(attribute_name, *args)
    hidden_field attribute_name, value: 0, id: false
    @template.content_tag 'label', class: 'checkbox', for: "#{@object_name}_#{attribute_name}" do
      options = args.extract_options!
      options[:include_hidden] = false
      args << options
      super(attribute_name, *args) + @template.content_tag('i') +
          @object.class.human_attribute_name(attribute_name)
    end
  end