Выбор Ruby on Rails Collection - как правильно выбрать правильное значение?

Я провел последние три дня, работая над коллекцией _ помощник по выбору формы для моего "списка" - формы, где пользователи могут выбрать категорию.

Я хотел бы, чтобы в качестве предварительно выбранного значения была указана категория, указанная в перечислении list.category_i

Мой код просмотра выглядит следующим образом:

<%= l.collection_select(:category_id, @category, :id, :name, options = {},
                        html_options = {:size => 10, :selected => @listing.category_id.to_s})%>

Я знаю, что это не правильно, но даже читая, глядя на объяснение из Shiningthrough http: //shiningthrough.co.uk/blog/show/) Я не могу понять, как поступить.

Спасибо за Вашу поддержку

Майк

Посмотреть как указано выш
Controller:

def categories #Step 2
@listing = Listing.find(params[:listing_id])
@seller = Seller.find(@listing.seller_id)
@category = Category.find(:all)
@listing.complete = "step1"

respond_to do |format|
  if @listing.update_attributes(params[:listing])
    flash[:notice] = 'Step one succesful. Item saved.'
    format.html #categories.html.erb
end
end
end

Ответы на вопрос(2)

но сравнение выполняется между целочисленными значениями.

if @listing.category_id != "" 
@listing.category_id = @listing.category_id.to_i
end

Это решает проблему - теперь предварительно выбрано правильное значение.

фактически она не нужна. Он автоматически выбирает параметр, значение которого совпадает со значением объекта построителя форм.

Позвольте мне показать вам пример. Предполагая, что каждый пост относится к категории.

@post = Post.new

<% form_for @post do |f| %>
  <!-- no option selected -->
  <%= f.collection_select :category_id, Category.all, :id, :name, :prompt => true  %>
<% end %>

@post = Post.new(:category_id => 5)

<% form_for @post do |f| %>
  <!-- option with id == 5 is selected -->
  <%= f.collection_select :category_id, Category.all, :id, :name, :prompt => true  %>
<% end %>

РЕДАКТИРОВАТ:

Я бы предложил использовать репрезентативные имена переменных. Используйте @categories вместо @category. :) Кроме того, отделите логику обновления от представления только для чтения.

def categories #Step 2
  @listing = Listing.find(params[:listing_id])
  @seller = Seller.find(@listing.seller_id)
  @categories = Category.find(:all)
  @listing.complete = "step1"

  respond_to do |format|
    if @listing.update_attributes(params[:listing])
      flash[:notice] = 'Step one succesful. Item saved.'
      format.html #categories.html.erb
    end
  end
end

<% form_for @listing do |f| %>
  <%= f.collection_select :category_id, @categories, :id, :name, :prompt => true %>
<% end %>

Если он не работает (то есть выбирает подсказку), это означает, что либо у вас нет привязанного к этой записи идентификатора категории, либо коллекция категорий пуста. Обязательно не сбрасывайте значение category_id для @listing где-либо до того, как объект будет передан в форму.

EDIT 2:

class Category
  def id_as_string
    id.to_s
  end
end

<%= f.collection_select :category_id, Category.all, :id_as_string, :name, :prompt => true  %>

ВАШ ОТВЕТ НА ВОПРОС