2009-06-30 2 views
7

Я провел последние три дня, работая над сборником _ выберите вспомогательный элемент формы для моей «листинга» - формы, в которой пользователи могут выбрать категорию.Ruby on Rails Collection select - как предварительно выбрать правильное значение?

Я хотел бы иметь категорию, которая в настоящее время установлена ​​в списке.category_id как предварительно выбранное значение.

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

<%= 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/6) Я не могу понять, как действовать.

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

Майкл

Вид: , как описано выше
Контроллер:

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 
+0

Дубликат http://stackoverflow.com/questions/1018836/rails-preselect-a-value-in-actionview-helper-collectionselect/ –

+0

Я добавил возможное решение для моего первоначального ответа. –

ответ

12

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

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

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

EDIT:

Я хотел бы предложить использовать репрезентативные имена переменных. Используйте @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, связанный с этой записью или коллекции Категория пуст. Обязательно не переустанавливайте значение 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 %> 
+0

Hi weppos, спасибо за быстрый и хороший ответ. Я ожидал, что collection_select будет вести себя так, к сожалению, он не ведет себя так, как в моем случае. Всякий раз, когда я вставляю в свой контроллер @ listing.category_id = 2 , я получаю предварительно выбранное поле так, как хочу. Хотя я получил @listing = Listing.find ...основанный на параметрах, и значение действительно установлено в БД, это не работает. Я, если честно, потерялся. –

+0

Не могли бы вы разместить полный пример, включая действие контроллера и просмотр? –

+0

Прошло три года, и я только что вернулся, чтобы снова увидеть ответ. Это просто хорошо для меня. Спасибо, Симоне! –

1

Мой category_id сохраняется в виде строки в базе данных, но сравнение между целыми числами.

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

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

+0

Проверьте мой EDIT 2. –

Смежные вопросы