Html 将标签添加到rails日期\u选择帮助器

Html 将标签添加到rails日期\u选择帮助器,html,ruby-on-rails,ruby,forms,accessibility,Html,Ruby On Rails,Ruby,Forms,Accessibility,我目前正在一个站点上进行无障碍性检修,遇到了一个我不知道如何在Rails中解决的问题。守则内容如下: Time.now.year-14,:end_year=>1900,:prompt=>true,:order=>[:day,:month,:year]}%> 产生: 生日 白天 1. ... 31 月 一月 ... 十二月 年 1998 ... 1900 有人知道我是否必须为已生成的3个选定字段手动编写标签/字段集吗?或者我应该以不同的方式使用rails代码。我对rails有点陌生。。。更像

我目前正在一个站点上进行无障碍性检修,遇到了一个我不知道如何在Rails中解决的问题。守则内容如下:


Time.now.year-14,:end_year=>1900,:prompt=>true,:order=>[:day,:month,:year]}%>
产生:

生日
白天
1.
...
31
月
一月
...
十二月
年
1998
...
1900
有人知道我是否必须为已生成的3个选定字段手动编写标签/字段集吗?或者我应该以不同的方式使用rails代码。我对rails有点陌生。。。更像是一个前锋

date_select("DOB", :birthdate, :prompt => {
:day => 'Select day', :month => 'Select month', :year => 'Select year',
:start_year => Time.now.year - 14, :end_year => 1900
})
更多选项请访问:

我认为不可能生成单独的标签。即使您愿意接受一个标签,也有一个附加的问题,即它不是严格有效的HTML,因为没有“生日”表单控件。您是否应该在label helper中使用:birthdate\u 3i?

只需将
日期选择
包装在
div
字段集中即可。标签可以指向任何具有ID的对象,如果您有多个输入输入到一个数据类型中(如rails
date\u select
),那么您可以标记容器,并让选择框成为它的组件

<%= f.label :birthdate %>
<div id="birthdate">
  <%= f.date_select :birthdate, {:start_year => Time.now.year - 14, :end_year => 1900, :prompt => true, :order => [:day, :month, :year]} %>
</div>

Time.now.year-14,:end_year=>1900,:prompt=>true,:order=>[:day,:month,:year]}%>

我最近在一个项目中遇到了这个问题,我们发现在Rails日期选择中,在每个
选择之前添加标签的唯一方法是使用monkey patch Rails。我们在Rails 5.1.4上。当
date\u separator
作为参数传递时,以下是构建月/日/年选择并在最后2个选择之前放置分隔符的原始方法:

这是我们的monkey补丁,它在每个日期前都放置了一个图例分隔符,并选择了正确的
for
标记:

module ActionView
  module Helpers
    class DateTimeSelector

      # Given an ordering of datetime components, create the selection HTML
      # and join them with their appropriate separators.
      def build_selects_from_types(order)
        select = ""
        order.reverse_each do |type|
          separator = separator(type)
          select.insert(0, separator.to_s + send("select_#{type}").to_s)
        end
        select.html_safe
      end

      # Returns the separator for a given datetime component.
      def separator(type)
        return "" if @options[:use_hidden]
        field_name = "#{@options[:prefix]}_#{@options[:field_name]}"
        case type
          when :year
            "<label for='#{field_name}_1i'>Year</label>"
          when :month
            "<label for='#{field_name}_2i'>Month</label>"
          when :day
            "<label for='#{field_name}_3i'>Day</label>"
          when :hour
            (@options[:discard_year] && @options[:discard_day]) ? "" : @options[:datetime_separator]
          when :minute, :second
            @options[:"discard_#{type}"] ? "" : @options[:time_separator]
        end
      end
    end
  end
end
模块操作视图
模块助手
类DateTimeSelector
#给定日期时间组件的顺序,创建选择HTML
#并用适当的分隔符将它们连接起来。
def build_从_类型(订单)中选择_
选择=“”
order.reverse|u每个do|类型|
分隔符=分隔符(类型)
select.insert(0,分隔符.to_s+发送(“select#{type}”).to_s)
结束
select.html\u safe
结束
#返回给定日期时间组件的分隔符。
def分离器(类型)
返回“”如果@options[:使用_hidden]
field_name=“#{@options[:prefix]}#{@options[:field_name]}”
案例类型
时间:年
“年”
时间:月
“月”
时间:白天
“一天”
时间:小时
(@options[:discard_year]&&&options[:discard_day])?“”:@选项[:日期时间分隔符]
时间:分,:秒
@选项[:“放弃{type}”]?“”:@选项[:时间分隔符]
结束
结束
结束
结束
结束

有一种方法不包括修补导轨。不过还是有点黑。其思想是增加由
date\u select
生成的select标记。我们将使用Nokogiri来实现这一点(需要Gemfile中的
gem'Nokogiri'

下面的代码将带有标签的
date\u select\u添加到库存表单生成器中,该生成器只执行以下操作:

class ActionView::Helpers::FormBuilder
  def date_select_with_labels(attribute, options = {})
    generated_selects = @template.date_select(object.model_name.singular, attribute, options)

    selects_with_labels = Nokogiri::HTML::Document.parse(generated_selects).css('select').map do |select|
      label(
        attribute,
        date_select_part_type_from_options(select, options[:include_blank]),
        options.reverse_merge(for: select.attr('id'))
      ) +
        select.to_s.html_safe
    end

    @template.content_tag(:div) do
      selects_with_labels.join('').html_safe
    end
  end

  private

  def date_select_part_type_from_options(select, include_blank)
    maybe_one = include_blank ? 1 : 0

    case select.css('option').size
    when 12 + maybe_one
      'Month'
    when (28 + maybe_one)..(31 + maybe_one)
      'Day'
    else
      'Year'
    end
  end
end

谢谢Micheal。现在我看到了“提示”选项的作用。但我真正想要的是为制作的选择框添加标签。我不确定它是否可行,所以我想我将它包装在一个带有图例的字段集中。这正是我需要的,以使这些
date\u select
s可访问。为了补充信息,我将它保存在
config/initializers/date\u time\u selector.rb
上,覆盖了超类。