Насколько я могу судить, это проблема представлений и контроллера.
Мне нужно разрешить пользователям редактировать несколько записей в одной из моих таблиц базы данных. Railscast 165 имеет дело с похожей ситуацией, но для меня это не совсем так: http://railscasts.com/episodes/165-edit-multiple
У меня есть фиксированный набор продуктов, и я должен позволить пользователям добавлять связанные с ними сорта к этим продуктам. Я рассмотрел более простое решение, требующее от пользователя перехода на страницу продукта и редактирования одного отдельного продукта за раз, но это не сработает для моего приложения. Вместо этого мне нужно предоставить больше функциональности стиля администратора для этой одной задачи.
Модель отношений здесь проста. Продукт has_many
сортов, а сорт belongs_to
продукт. В моем пользовательском интерфейсе я просто позволяю пользователю выбрать продукт из выпадающего меню, содержащего все доступные продукты на сайте, а затем пользователь может ввести название сорта в текстовом поле. Например, если мы говорим о яблоках, то пользователь может выбрать яблоки из выпадающего списка продуктов, и он может ввести «fuji» и разнообразие. Мне просто нужно сохранить product_id
и сорт [имя] в таблице сортов. Однако мне нужно сделать это для нескольких записей одновременно.
В настоящее время у меня есть форма рендеринга с выпадающим списком, отображающим правильный выбор продукта. Кажется, проблема в том, что входные данные рендеринга в html выглядят так:
<label for="nil_class_variety">Variety</label>
<input id="nil_class_name" name="nil_class[name]" size="30" type="text" />
Чтобы визуализировать части формы, я следую мультимодельной технике форм Advanced Rails Recipes (то есть пути Райана Бейтса). Я потратил около 10 часов, пытаясь это сделать, и мне кажется, что я сейчас очень близок, но я не знаю, в чем проблема на данный момент.
Вот мои настройки:
Контроллер продуктов
def edit_multiple
@products = Product.find(:all)
end
def update_multiple
params[:product][:existing_variety_attributes] ||= {}
@products = Product.find(:all)
if @products.each do |product|
product.update_attributes!(params[:product].reject { |k,v| v.blank? })
end
flash[:notice] = "Updated products!"
redirect_to edit_user_path(self.current_user)
else
render :action => 'edit'
flash[:error] = "Something went wrong. Please try again."
end
end
Routes.rb # Чтобы заставить работать пользовательские действия контроллера
map.resources :products, :collection => { :edit_multiple => :get, :update_multiple => :put}
Вид / произведения / edit_multiple.html.erb
<%= error_messages_for :product %>
<% form_for :product, :url => update_multiple_products_path, :html => { :method => :put } do |f| %>
<div id="varieties">
<%= render :partial => 'variety' %>
</div>
<p><%= add_variety_link "+ Add another variety" %></p>
<%= f.submit 'Submit Varieties' %>
<%end%>
Вид / произведения / _variety.html.erb
Примечание. Пока я не позволяю пользователям редактировать сорта, которые они отправляют. Поэтому я удалил следующую строку из техники Райана Бейтса, потому что она выдавала ошибку, и я не думаю, что она мне нужна, но я могу ошибаться: <%# new_or_existing = variety.new_record? ? 'new' : 'existing' %>
Вот что у меня есть в этом частичном разнообразии:
<% prefix = "product[new_variety_attributes][]" %>
<% fields_for @variety do |variety_form| -%>
<%= collection_select(:product, :product_id, Product.all, :id, :name, {:prompt => true}) %>
<%= variety_form.label :variety %>
<%= variety_form.text_field :name %>
<%= link_to_function "- Remove Variety", "$(this).up('.variety').remove()" %>
<%end -%>
ПРИМЕЧАНИЕ. В настоящее время работающий javascript работает. На странице просмотра edit_multiple я могу динамически добавлять и удалять входные данные товаров / сортов. Как я уже говорил, выпадающий список также заполняется правильно. Таким образом, мне кажется, что мне просто нужно получить входные данные разнообразия для правильной визуализации и заставить контроллер правильно их обрабатывать. Спасибо за вашу помощь!
Обновление
Когда я выбираю один продукт из выпадающего списка и набираю имя во входных данных сорта, отправка выдает следующую ошибку и трассировку:
ActiveRecord::UnknownAttributeError in ProductsController#update_multiple
unknown attribute: product_id
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.3/lib/active_record/base.rb:2740:in `attributes='
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.3/lib/active_record/base.rb:2736:in `each'
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.3/lib/active_record/base.rb:2736:in `attributes='
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.3/lib/active_record/base.rb:2628:in `update_attributes!'
/Users/michael/dev/fresh/app/controllers/products_controller.rb:74:in `update_multiple'
/ Users / michael / dev / fresh / app / controllers / products_controller.rb: 73: в each'
/Users/michael/dev/fresh/app/controllers/products_controller.rb:73:in
update_multiple '
Журнал показывает правильный product_id и правильное имя, которое я ввел, но вы можете видеть, что он вызывает нулевой класс:
Processing ProductsController#update_multiple (for 127.0.0.1 at 2009-10-08 07:31:05) [PUT]
Parameters: {"commit"=>"Submit Varieties", "authenticity_token"=>"zzkveSe7qzv2NY8WPrR2cYS376u6DBiz8Vc9iNFLQy8=", "product"=>{"product_id"=>"5"}, "nil_class"=>{"name"=>"yellow"}}
Когда я пытаюсь ввести более одной записи продукта / сорта, журнал не распознает ничего, кроме первой. Я получаю тот же результат, что и при вводе только одной записи продукта / сорта.