путаница в отношении accepts_nested_attributes_for - PullRequest
1 голос
/ 24 июня 2010

Почему-то у меня сложилось впечатление, что accepts_nested_attributes_for позволит мне заполнить дочерний объект через родителя:

person.update_attributes person_hash

, но на практике я закончил так:

person.address.update_attributes person_hash[:address]
person_hash.delete :address
person.update_attributes person_hash

Сейчас, http://guides.rubyonrails.org упоминает acceptpts_nested_attributes_for только косвенно, и документация по API для этого метода также весьма загадочна.

1) Может ли кто-нибудь показать базовый вариант использования для accepts_nested_attributes_for?Я имею в виду, я понимаю, как он объявлен, я не понимаю, какое это имеет значение.

2) Является ли способ заполнения вложенного объекта «правильным» в рельсах, или что-то более «элегантное»?

Спасибо!

обновление
Модель, для наглядности

class Person < ActiveRecord::Base
  has_one :address
  accepts_nested_attributes_for :address
end

обновление2 , для j.
Объявление формы выглядит следующим образом

<% fields_for "people", person, :index => person.id do |person_form| %>
  ... 
  <% person_form.fields_for person.address do |address_form| %>
    <%= address_form.text_field :street %>
  <% end %>
  ...
<% end %>

Но оно дает мне html-имена вроде people[66][address][street], а не people[66][address_attributes][street]

1 Ответ

3 голосов
/ 25 июня 2010

С помощью accepts_nested_attributes_for вы можете делать следующее:

# example from railsapi.com
# view
<% form_for @person, :url => { :action => "create" } do |person_form| %>
   Name: <%= person_form.text_field :name %>
   ...
   <% person_form.fields_for :address do |address_fields| %>
     Street  : <%= address_fields.text_field :street %>
     Zip code: <%= address_fields.text_field :zip_code %>
   <% end %>
<% end %>

При этом ваши параметры будут выглядеть как

params = { 
   :person => { 
      :name => 'Jack',
      :address_attributes => { :street => 'Street', :zip_code => '11111' } 
   }
}

, и вы сможете создать человека исвязанный адрес просто используя

@person = Person.create(params)

Для получения дополнительной информации, railsapi.com.Я надеюсь, что это поможет.

Редактировать

Я не знаю, почему ваши параметры выглядят так: / Но использование

#person.address.update_attributes person_hash.delete(:address) OR
person.address.update_attributes person_hash[:address]
person_hash.delete :address

person.update_attributes person_hash

не неправильно .Просто, как вы сказали, можно было бы сделать больше элегантного кода.

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