Обработка MongoMapper EmbeddedDocument в форме Rails - PullRequest
3 голосов
/ 28 апреля 2011

Прежде всего, я новичок в программировании в целом и новичок в Rails.Я выбрал Rails, потому что это кажется простым языком для начала.Для моего проекта я использую MongoMapper с Rails.

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

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

class User
  include MongoMapper::Document

  key :email, String, :required => true
  key :first_name, String
  key :last_name, String
  key :role, String
  many :addresses
  timestamps!
end

class Address
  include MongoMapper::EmbeddedDocument

  key :location, String
  key :street, String
  key :city, String
  key :zip, Integer
  key :state, String
  key :country, String

end

Я хочу создавать / редактировать EmbeddedDocument одновременно с документом.Я попытался использовать fields_for:

<% f.fields_for :address, @user.addresses do |address| -%>
  <div class="field">
    <%= address.label :street %><br />
    <%= address.text_field :street %>
  </div>
<% end %>   

Но я получаю

неопределенный метод `улица 'для # <\ Array: 0x0000010126e3f8>

СпасибоВы заранее.

Ответы [ 2 ]

2 голосов
/ 29 апреля 2012

fields_for будет работать, если вы определите addresses_attributes= для User.По какой-то причине fields_for фактически меняет свое поведение, если вы определите этот метод.

Вот пример реализации:

def addresses_attributes=(id_and_attrs)    
  id_and_attrs.each do |id, attrs|
    address = self.addresses.find(id) || self.addresses.build(:id => id)
    address.attributes = attrs
  end
end

Не проверено, так что вам придется работать над изломами.В частности, я не помню, как вложенные параметры проходят по-разному, если адреса полностью новые, потому что пользователь новый.

0 голосов
/ 10 июля 2012

Насколько я помню, fields_for не включает в себя идентификатор объекта, для этого вам нужно будет добавить скрытое поле.

<%= address.hidden_field :id, :value => address.object.id %>

Тогда ваш метод address_attributes = будет выглядеть следующим образом:

def addresses_attributes=(addresses_attributes)    
  addresses_attributes.each do |index, attrs|
    address = self.addresses.find(attrs['id']) || self.addresses.build
    address.attributes = attrs
  end
end

Спасибо, Брайан, это обеспечит решение аналогичной проблемы, с которой я столкнулся.

...