1

ある国の州のリストがあります。それらをに表示したいと思います<select>。各状態のフラグを表すアイコンを表示しようとしているので、このJQueryプラグインを使用しています。とにかく、この時点でこれは純粋なRailsの質問です。

optionそのプラグインを使用するには、これに含まれる各タグに「data-image」属性を設定する必要がありますselect

私がこれまでに持っているのは:

<%= collection_select(:state, :code, @states, :code, 
:name, {"data-image" => lambda {|state| image_path("/flags/#{state.code}.png") }}) %>

「data-image」属性をそれぞれに設定するためにさまざまな方法を試しましたがoption、これまでのところ、結果は次のとおりです。

<select id="state_code" name="state[code]">
  <option value="foo">State Foo</option>
  <option value="bar" selected="selected">State Bar</option>
</select>

したがって、「data-image」属性を挿入できません。私はいくつかの光を探していました、そして私はこの[api.rubyonrails]と次の例を見ました、

collection_select(:post, :category_id, Category.all, :id, :name, {:disabled => lambda{|category| category.archived? }})

それは基本的に私が探しているものであり、私のものはほとんど同じものですが、それは機能しません。Rails2.3.11を使用しています。提案に感謝します。

4

2 に答える 2

1

このStackoverflowの質問に対する2番目の回答を確認してください。

基本的には、options_for_selectヘルパーを使用してカスタムdataプレフィックス属性を作成する必要があります。

于 2013-01-06T18:05:12.740 に答える
0

それで、私は問題を解決することになりました、以下は完全な解決策です。私が理解している限り、私はRails 2.3を使用しているので、dataプレフィックス付きの属性をサポートするヘルパーはありません。この回答options_for_selectで指摘されているように、Rails3ヘルパーを使用する必要があることがわかりました。ちなみに、msDropDownプラグインを使用する代わりに、ddSlickを使用することになりました。また、を使用する代わりに、を使用しました。次に、基本的にあなたが持っている必要があるものは次のとおりです。collection_selectselect_tag

rails_overrides.rb

# https://stackoverflow.com/a/13962481/914874
module RailsOverrides
  def options_for_select(container, selected = nil)
      return container if String === container
      container = container.to_a if Hash === container
      selected, disabled = extract_selected_and_disabled(selected)

      options_for_select = container.inject([]) do |options, element|
        html_attributes = option_html_attributes(element)
        text, value = option_text_and_value(element)
        selected_attribute = ' selected="selected"' if option_value_selected?(value, selected)
        disabled_attribute = ' disabled="disabled"' if disabled && option_value_selected?(value, disabled)
        options << %(<option value="#{html_escape(value.to_s)}"#{selected_attribute}#{disabled_attribute}#{html_attributes}>#{html_escape(text.to_s)}</option>)
      end

      options_for_select.join("\n").html_safe
  end

  def option_text_and_value(option)
    # Options are [text, value] pairs or strings used for both.
    case
    when Array === option
      option = option.reject { |e| Hash === e }
      [option.first, option.last]
    when !option.is_a?(String) && option.respond_to?(:first) && option.respond_to?(:last)
      [option.first, option.last]
    else
      [option, option]
    end
  end

  def option_html_attributes(element)
    return "" unless Array === element
    html_attributes = []
    element.select { |e| Hash === e }.reduce({}, :merge).each do |k, v|
      html_attributes << " #{k}=\"#{ERB::Util.html_escape(v.to_s)}\""
    end
    html_attributes.join
  end
end

application_helper.rb

module ApplicationHelper
  include RailsOverrides
end

index.html.erb

<%= select_tag(:state, options_for_select (states.map { |state| [state.name, state.code, {"data-imagesrc" => image_path("flags/#{state.code}.png"), "data-description" => "Data from #{state.name}"}]}, current_state.code)) %>

ここでcurrent_state、デフォルトオプションとして選択される状態です。たとえば、私はそれをsession変数に格納しますが、簡単にするために、それはである可能性があり@current_stateます。

これを解決する別の方法は、 options_from_collection_for_select_with_dataの変更バージョンを使用して、を公開する必要がないようにすることmapです。

于 2013-01-07T20:25:55.207 に答える