Более информативный вопрос заключается в том, что делает код не потокобезопасным, и ответ заключается в том, что существует четыре условия, которые должны быть выполнены ... Представьте себе следующий код (и его перевод на машинный язык)
totalRequests = totalRequests + 1
MOV EAX, [totalRequests] // load memory for tot Requests into register
INC EAX // update register
MOV [totalRequests], EAX // store updated value back to memory
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 %>
РЕДАКТИРОВАТЬ :
Я бы предложил использовать репрезентативные имена переменных. Используйте @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 пуста. Убедитесь, что вы не сбрасываете значение category_id для @listing где-нибудь до того, как объект будет передан в форму.
РЕДАКТИРОВАТЬ 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 %>
Мой category_id сохраняется в базе данных как строка, но сравнение выполняется между целыми значениями.
if @listing.category_id != ""
@listing.category_id = @listing.category_id.to_i
end
Это решает проблему - теперь предварительно выбрано правильное значение.