如何在Rails 3中的options_from_collection_for_select中自定义菜单选项?

时间:2011-04-12 13:29:06

标签: ruby-on-rails-3

我认为这是:

<%
@plan = Plan.limit(4).all
plan ||= Plan.find(params[:plan_id])

%>

<%= select_tag "Plan", options_from_collection_for_select(@plan, 'id', 'name', plan.id) %><br />

产生以下内容:

<select id="Plan" name="Plan"><option value="1">Gecko</option> 
<option value="2" selected="selected">Iguana</option> 
</select>

但是,我希望它能产生以下选项:

<select id="Plan" name="Plan"><option value="1">Gecko ($50)</option> 
<option value="2" selected="selected">Iguana ($99)</option> 
</select>

括号中的价格为plan.amount

2 个答案:

答案 0 :(得分:17)

您可以在模型中创建一个返回您想要呈现的值的方法:

class Plan < ActiveRecord::Base
  ...

  def display_name
    "#{self.name} (#{self.amount})"
  end
end

# View
<%= select_tag "Plan", options_from_collection_for_select(@plan, 'id', 'display_name', plan.id) %>

答案 1 :(得分:2)

options_from_collection_for_select也接受文本方法作为lambda,因此您可以在视图中编写自定义方法而不是模型,因为您有一些特定于视图的代码,您不希望污染模型。< / p>

<%= select_tag "Plan", options_from_collection_for_select(@plan, 'id', lambda { |plan| "#{plan.name} (#{plan.amount})")}, plan.id) %>