Как мне настроить параметр меню в options_from_collection_for_select в Rails 3?

#ruby-on-rails-3

#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 .

Ответ №1:

Вы могли бы создать метод в вашей модели, который возвращает значение, которое вы хотите представить:

 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) %>
  

Ответ №2:

options_from_collection_for_select также принимает текстовый метод как лямбда, поэтому вы можете написать пользовательский метод в представлении вместо модели, если у вас есть какой-то специфичный для представления код, которым вы не хотите загрязнять модель.

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