Вложенные формы Rails с has_one через отношения

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

Я пытаюсь создать подписку, клиента и адрес клиента в одной форме, но пока мне удалось создать только подписку и клиента. У меня проблемы с адресом.

У клиента может быть много подписок, но только один адрес (пока, по крайней мере)

Мой (сокращенный) код выглядит следующим образом:

subscription.rb

class Subscription < ActiveRecord::Base

  belongs_to :customer
  has_one :address, through: :customer

  accepts_nested_attributes_for :customer, :address
  attr_accessible :customer_attributes, :address_attributes

customer.rb

class Customer < ActiveRecord::Base

  has_one :address
  has_many :subscriptions

  accepts_nested_attributes_for :address
  attr_accessible :address_attributes

address.rb

class Address < ActiveRecord::Base

  belongs_to :customer
  has_many :subscriptions, through: :customer

subscriptions_controller.rb

def new
  @subscription = Subscription.new    
  customer = @subscription.build_customer
  address = customer.build_address
  subscription_line_items = @subscription.subscription_line_items.build
end

подписки / _form.html.erb

<%= form_for(@subscription) do |subscription_form| %>
  <% if @subscription.errors.any? %>
    <!-- Error stuff -->
  <% end %>

  <div class="field">
    <%= subscription_form.label :start_date %><br />
    <%= subscription_form.text_field :start_date %>
  </div>

  ...

  <h2>Customer Details</h2>
  <%= subscription_form.fields_for :customer do |customer_fields| %>
    <%= customer_fields.label :first_name %><br /> 
    <%= customer_fields.text_field :first_name %>
    ...
  <% end %>

  <h2>Address</h2>
  <%= subscription_form.fields_for :address do |address_fields| %>
    <%= address_fields.label :address_1 %><br /> 
    <%= address_fields.text_field :address_1 %>
    ...
  <% end %>

  <div class="actions">
    <%= subscription_form.submit %>
  </div>
<% end %>

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


person purpletonic    schedule 28.02.2013    source источник
comment
Единственная переменная из вашего контроллера, которая будет передана вашему представлению, - это переменная @subscription. Вам нужно сделать и другие переменные экземпляра.   -  person JosephL    schedule 01.03.2013
comment
Если я перейду на переменные экземпляра в контроллере и в fields_for в представлении, я получаю сообщение об ошибке при отправке Can't mass-assign protected attributes: customer, address   -  person purpletonic    schedule 01.03.2013


Ответы (1)


Purpletonic, ищите вашу последнюю проблему по поводу:

Can't mass-assign protected attributes: customer, address

вам нужно добавить эти атрибуты в свою модель, например:

attr_accessible :customer, :address
person Hugo    schedule 10.03.2013