Ruby on Rails: почему в окне выбора не отображается текущее значение объекта? - PullRequest
3 голосов
/ 14 декабря 2010

Вот соответствующий код от views/products/edit.html.erb:

<%= form_for(:product, :url => {:action => 'update', :id => @product.id}) do |f| %>
  <%= render(:partial => "form", :locals => {:f => f}) %>
  <%= submit_tag("Update Product") %>
<% end %>

от views/products/_form.html.erb:

<%= select_with_new_option(f, :shop, :name, :id) %>

и от helpers/products_helper.rb:

def select_options_with_create_new(objects, text_field, value_field, options={})
  object = objects.to_s.singularize
  all_objects = object.capitalize.constantize.all
  all_objects = all_objects.sort_by(&options[:order_by]) if options.has_key?(:order_by)
  select_options = all_objects.map{ |obj| [obj.send(text_field), obj.send(value_field)] }
  select_options << [wrap_create_new_option("create new #{object}".titleize), "new_#{object}"]
  options_for_select(select_options)
end

def wrap_create_new_option(str)
  ">> #{str} <<"
end

# By default, sorts by 'text_field'.
def select_with_new_option(f, object, text_field, value_field)
  f.select(:"#{object}_id", select_options_with_create_new(object.pluralize, text_field, value_field, :order_by => text_field))
end

Я ожидаю, что поле выбора будет @product.shop_id по умолчанию, но это не так (первая опция всегда является значением по умолчанию).

Чего мне не хватает?

Ответы [ 2 ]

7 голосов
/ 14 декабря 2010

Хорошо, я понял.Просто удалите options_for_select(select_options) в методе select_options_with_create_new.

options_for_select собирает двумерный массив select_options в строку параметров html, что принимается помощником формы selectбез присвоения атрибута selected.Просто передайте 2-й массив методу select в качестве второго аргумента, он автоматически назначит selected.

0 голосов
/ 14 декабря 2010

Я думаю, что в этом случае все, что вам нужно сделать, это убедиться, что вы установили @product в вашем edit действии:

def edit
  @product = Product.find(params[:id])
end

Затем измените свою первую строку:

<%= form_for(:product, :url => {:action => 'update', :id => @product.id}) do |f| %>

до

<%= form_for(@product, :url => {:action => 'update', :id => @product.id}) do |f| %>

Первый блок кода, безусловно, обновит нужный продукт, но вы увидите только текущие значения, если вы сгенерируете form_for @product с этой переменной @product.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...