Редактирование нескольких записей - предоставление доступа всем зарегистрированным пользователям - PullRequest
0 голосов
/ 08 октября 2009

Насколько я могу судить, это проблема представлений и контроллера.

Мне нужно разрешить пользователям редактировать несколько записей в одной из моих таблиц базы данных. 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"}}

Когда я пытаюсь ввести более одной записи продукта / сорта, журнал не распознает ничего, кроме первой. Я получаю тот же результат, что и при вводе только одной записи продукта / сорта.

1 Ответ

1 голос
/ 09 октября 2009

Короткий ответ на вашу проблему: @variety не определен в fields_for @variety. Правильная версия этой строки в /app/views/products/_variety.html.erb:

<% fields_for :variety do |variety_form| -%>

Кроме того, в вашей линейке лейблов есть незначительный задира.

<%= variety_form.label :variety %>

должно быть

<%= variety_form.label :name, "Variety" %>

Я не могу сказать, является ли ваша цель обновлять сразу несколько продуктов и разновидностей или просто обновлять разновидности одного продукта. Предполагая последнее, вы должны использовать accepts_nested_attributes_for (прокрутите вниз до Примера вложенных атрибутов), похоже, это может быть более простой способ сделать это. Также см. Репозиторий github Complex-Forms-Example для рабочей демонстрации.

Но, похоже, это не так. Мне кажется, что ваши функции javascript добавляют формы / удаляют значения для продукта и разновидностей.

Это будет работать в контроллере для добавления сортов, но требует немного больше работы для удаления существующих сортов. Но ссылки на железные дороги, с которыми вы связаны, предоставляют всю необходимую информацию, чтобы собрать их вместе.

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