Проблемы с nested_form, ассоциации моделей на несколько уровней - PullRequest
1 голос
/ 21 февраля 2012

У меня проблемы с созданием вложенной формы, которая будет корректно работать со следующей моделью домена с использованием плагинов nested_form и simple_form.Я думаю, что я неправильно создаю формы или вызовы attr_accessible и accepts_nested_attributes_for.

У меня есть эта модель домена со следующими ассоциациями:

company.rb

class Company < ActiveRecord::Base 
  has_one :subscription

  attr_accessible :name, :subscription_attributes, :cycles_attributes, :payments_attributes
  accepts_nested_attributes_for :subscription
end

subscription.rb

class Subscription < ActiveRecord::Base
    belongs_to: company
    has_many :cycles

    attr_accessible :company_id, :cycles_attributes, :payments_attributes
    accepts_nested_attributes_for :cycles
end

cycle.rb

class Cycle < ActiveRecord::Base
    belongs_to :subscription
    has_many :payments

    attr_accessible :payments_attributes
    accepts_nested_attributes_for :payments
end

payment.rb

class Payment < ActiveRecord::Base

  belongs_to :cycle

end

На мой взгляд следующее:

<%= simple_nested_form_for company do |f| -%>
  <%= f.input :name %>

  <%= f.fields_for :subscription do |s| %>
  #assorted fields for subscription

    <%= s.fields_for :cycles do |c| %>
      #assorted fields for cycle
      <%= c.link_to_remove "[ - ] Erase Cycle"  %>

      <%= c.fields_for :payments do |p| %>
        #assorted fields for payments
        <%= p.link_to_remove "[ - ] Erase Payment"  %>
      <% end %>

      <%= c.link_to_add "[ + ] New Payment", :payments %>

    <% end %>
  <%=  s.link_to_add "[ + ] New Cycle", :cycles %>

<% end %>

Контроллер компании:

def new
  @company = Company.new
  @company.build_subscription

  @categories = Category.find(:all)

  respond_with @company
end

def create
  @company = Company.new(params[:company])

  if @company.save 
    flash[:notice] = "Success"
  else
    flash[:error] = "Error #{@company.errors.full_messages}"
  end

  respond_with @company
end

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

Parameters: {"utf8"=>"✓", "authenticity_token"=>"57wgXJinL6kql0F9CxShKpf11RhdMfqXnb6y8K/pDg0=", 
"company"=>{"name"=>"asdf12",
  "subscription_attributes"=>{
    "cycles_attributes"=>{
      "0"=>{"plan_id"=>"1", "amount"=>"123", "months"=>"12", "_destroy"=>"false"}
    }, 
    "0"=>{
      "0"=>{
        "payments_attributes"=>{
          "new_1329843584974"=>{"payment_type"=>"Efectivo", "amount"=>"123", "receipt_number"=>"1231", "note"=>"asdf asdf", "_destroy"=>"false"
           }
        }
      }
    }
  }
}, "commit"=>"Save"}

WARNING: Can't mass-assign protected attributes: 0

Ошибка:

@messages={:"subscription.cycles.subscription"=>["can't be blank"],
           :"subscription.cycles.payments"=>["can't be blank"]}

Что-то не так с передачей атрибутов в приложение, я думаю, что когда я нажимаю на кнопку нового платежа, он создается «за пределами» формы ... кто-нибудь сталкивался с чем-то подобным?

Если вам нужна дополнительная информация, дайте мне знать.

1 Ответ

0 голосов
/ 21 февраля 2012

Проблема была с самим плагином nested_form.

При наличии отношения has_one и вложенных моделей в качестве дочерних элементов у nested_form возникли проблемы при создании форм.

Я проверил этот запрос и исправил соответствующий файл с изменением

Выпуск № 124 в репозитории nested_form

патч, исправляющий проблему

Этот код должен быть в конечном итоге объединен с основным репо.

...