5

現在、あるサイトでアクセシビリティのオーバーホールを行っていますが、Rails で解決する方法がわからない問題に遭遇しました。コードは次のとおりです。

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

生成するもの:

<label for="birthdate">Birthdate</label>
<select id="birthdate_3i" name="birthdate(3i)">
    <option value="">Day</option>
    <option value="1">1</option>
        ...
    <option value="31">31</option>
</select>
<select id="birthdate_2i" name="birthdate(2i)">
    <option value="">Month</option>
    <option value="1">January</option>
        ...
    <option value="12">December</option>
</select>
<select id="birthdate_1i" name="birthdate(1i)">
    <option value="">Year</option>
    <option value="1998">1998</option>
        ...
    <option value="1900">1900</option>
</select>

作成された 3 つの選択フィールドに対して手動でラベル/フィールドセットを作成する必要があるかどうかを知っている人はいますか? または、レールコードを別の方法で使用する必要があります。私はレールに少し慣れていません...もっとフロントエンダーです。

4

5 に答える 5

0
date_select("DOB", :birthdate, :prompt => {
:day => 'Select day', :month => 'Select month', :year => 'Select year',
:start_year => Time.now.year - 14, :end_year => 1900
})

その他のオプション:
http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-date_select

于 2012-08-22T02:23:39.413 に答える
0

Railsへのパッチ適用を含まない方法があります。それでもハックです。アイデアは、によって生成された選択タグを拡張することdate_selectです。これを行うために Nokogiri を使用します ( gem 'nokogiri'Gemfile で必要)。

date_select_with_labels以下のコードは、まさにそれを行うストック フォーム ビルダーに追加します。

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
于 2020-03-13T07:56:30.910 に答える