我有一个国家的州名单,我想在<select>
上显示一个州。由于我试图显示一个代表每个州旗帜的图标,我使用的是this JQuery插件。无论如何,在这一点上,这是一个纯粹的Rails问题。
要使用该插件,我需要在此option
中包含的每个select
标记上设置“数据图像”属性。
到目前为止我所拥有的是:
<%= collection_select(:state, :code, @states, :code,
:name, {"data-image" => lambda {|state| image_path("/flags/#{state.code}.png") }}) %>
我尝试过很多方法为每个option
设置“数据图片”属性,但到目前为止结果是:
<select id="state_code" name="state[code]">
<option value="foo">State Foo</option>
<option value="bar" selected="selected">State Bar</option>
</select>
因此,我没有成功注入我的“数据图像”属性。我一直在寻找一些亮点,我看到this [api.rubyonrails]和下面的例子,
collection_select(:post, :category_id, Category.all, :id, :name, {:disabled => lambda{|category| category.archived? }})
这基本上就是我正在寻找的东西,我的几乎是同样的东西,但它不起作用。我正在使用Rails 2.3.11。我会感激建议。
答案 0 :(得分:1)
查看this Stackoverflow question的第二个答案。
基本上,它涉及使用options_for_select
帮助程序来创建自定义data
前缀属性。
答案 1 :(得分:0)
所以,我最终解决了问题,以下是完整的解决方案。据我所知,由于我使用的是Rails 2.3,因此没有帮助者支持data
前缀属性。事实证明,我需要使用this回答中指出的Rails 3 options_for_select
助手。作为旁注,不是使用msDropDown插件,而是最终使用了ddSlick。另外,我使用collection_select
而不是select_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
。