Вложенная форма: ресурс добавляется динамически, но не создается? - PullRequest
0 голосов
/ 23 июля 2011

Я использую вложенный гем gem , и я динамически добавляю продукты в форму. Когда я нажимаю «добавить», появляется другой ресурс продукта, но при создании он удаляет старые полностью. Вот как выглядит сценарий:

  1. Заполните поле
  2. Выберите дату
  3. Заполните Товар (один уже в форме)
  4. Добавьте еще 5 продуктов (Продукты 2, 3, 4, 5)
  5. Заполните все продукты
  6. "нажмите" Создать
  7. Создан продукт 5

Вот так выглядит моя вложенная форма:

<%= nested_form_for @location, :url => products_path(@product) do |f| %>
    <%= f.label :business %>
    <%= f.text_field :business %>
    <%= f.label :address %>
    <%= f.text_field :address %>

 <%= f.fields_for :product_dates, :url => products_path(@product) do |d| %>
     <%= d.label :date %>
     <%= d.date_select :date %>

 <%= d.fields_for :products, :url => products_path(@product) do |p| %>
     <%= p.text_field :name %>
     <%= p.text_field :price %>
     <%= p.text_field :tag_list %>
     <%= p.link_to_remove "Remove Product" %>       
     <% end %>
     <%= d.link_to_add "Add", :products %>
 <% end %>
 <%= f.submit "Finish" %>
<% end %>

Контроллер:

class ProductsController < ApplicationController

    def new
        @location = Location.new
        @product = Product.new
        product_date = @location.product_dates.build
        product_date.products.build
    end

    def create
        @location = Location.create(params[:location])
        if @location.save
            flash[:notice] = "Products Created."
            redirect_to :action => 'index' 
        else
            render :action => 'new'
        end
  end

Модель:

class User < ActiveRecord::Base
  devise
  attr_accessible :email, :password, :password_confirmation, :remember_me
  has_many :products,  :dependent => :destroy
end


class Location < ActiveRecord::Base
    attr_accessible :address, :business, :product_dates_attributes
    has_many :products
    has_many :product_dates 
    accepts_nested_attributes_for :product_dates    
end

class ProductDate < ActiveRecord::Base
    attr_accessible :date, :products_attributes
    belongs_to :location
    belongs_to :user
    has_many :products
    accepts_nested_attributes_for :products
end

class Product < ActiveRecord::Base
    attr_accessible :name, :price, :tag_list
    belongs_to :user
    belongs_to :location
    belongs_to :product_date
end

Есть предложения?

1 Ответ

1 голос
/ 24 июля 2011

Прежде всего удалите объявления url_for в объявлениях fields_for, чтобы вы получили

<%= nested_form_for @location, :url => products_path(@product) do |f| %>
    <%= f.label :business %>
    <%= f.text_field :business %>
    <%= f.label :address %>
    <%= f.text_field :address %>

    <%= f.fields_for :product_dates do |d| %>
       <%= d.label :date %>
       <%= d.date_select :date %>

       <%= d.fields_for :products do |p| %>
         <%= p.text_field :name %>
         <%= p.text_field :price %>
         <%= p.text_field :tag_list %>
         <%= p.link_to_remove "Remove Product" %>       
       <% end %>
       <%= d.link_to_add "Add", :products %>
    <% end %>
 <%= f.submit "Finish" %>
<% end %>

Что действительно сбивает с толку, так это весь ваш подход к маршрутизации и параметрам. Это просто не правильно. У вас есть form_for @location с: url products_path (@product). Это позволит по-королевски вызвать проблемы с отправляемыми параметрами, и в этом заключается проблема. Придерживайтесь маршрутизации к контроллеру местоположения, а не контроллеру продуктов, удалив products_path (@product) из вашей декларации nested_form_for, и вы обнаружите, что у вас будут сохранены все необходимые записи, но вам, скорее всего, придется изменить объявление redirect_to в создаваемом location_controller. действие и то же самое для update_action.

Но зачем вообще использовать контроллер продуктов, когда вы имеете дело с локацией? Опять же, это просто не естественно и не интуитивно понятно.

И последнее. Ваши ссылки на удаление не будут работать, так как вы не добавили необходимое объявление: absolute =>: destroy к объявлениям has_many, и вы также пропускаете объявления: reject_if и: allow_destroy => true в объявлениях acceptpts_nested_attributes.

Могу ли я настоятельно рекомендовать вам 1) Используйте либо контроллер местоположения, либо контроллер продуктов, но не оба Я имею в виду ссылку, чтобы перейти к этой форме link_to контроллера местоположения и установить все там или использовать form_for @product вместо @location и обрабатывать все в контроллере продуктов

2) внимательно следите за вещами, на которых основан этот драгоценный камень http://railscasts.com/episodes/196-nested-model-form-part-1 http://railscasts.com/episodes/197-nested-model-form-part-2

3) Потратьте некоторое время на изучение того, как помощники вида рельсов организуют хэш параметров в действиях контроллеров. В вашем случае внимательно посмотрите в файле журнала параметры, которые входят в действие создания в том виде, в котором они находятся в данный момент. Скорее всего, вы увидите, что параметры не являются вложенными так, как вы бы это представляли, поэтому объявление с вложенными атрибутами не работает должным образом

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