Вложенный атрибут начальных данных Rails3 - PullRequest
4 голосов
/ 26 февраля 2011

Что я здесь не так делаю? Формы работают, но продолжают получать "неопределенный метод` to_i 'для: street1: Symbol "при попытке заполнения данных.

EDIT = Если я делаю все как единичный адрес (has_one вместо has_many), начальное число работает.

РЕДАКТИРОВАТЬ 2 = См. Ответ ниже для других ...

address.rb
class Address < ActiveRecord::Base
    attr_accessible :street1, :street2, :city, :state, :zipcode, :deleted_at, :addressable_type, :addressable_id, :current, :full_address, :address_type
    belongs_to :addressable, :polymorphic => true
    scope :vendor, where("address_type='Vendor'")

    before_save :update_full_address

    def update_full_address
      unless self.street2.blank?
        street = self.street1 + "<br />" + self.street2 + "<br />" 
      else 
        street = self.street1 + "<br />"
      end
      citystatezip = self.city + ", " + self.state + " " + self.zipcode
      self.full_address = street + citystatezip
    end
end

vendor.rb

class Vendor < ActiveRecord::Base
  attr_accessible :name, :contact, :phone, :addresses_attributes
  has_many :addresses, :as => :addressable
  accepts_nested_attributes_for :addresses, :allow_destroy => true, :reject_if => proc { |obj| obj.blank? }
end

начальные данные

require 'faker'

Vendor.delete_all
["Company A", "Company B", "Company C", "Company D"].each do |c|
  params = {:vendor => 
      {
        :name => c,
        :contact => Faker::Name.name,
        :phone => Faker::PhoneNumber.phone_number,
        :addresses_attributes => {
          :street1 => Faker::Address.street_address,
          :city => Faker::Address.city,
          :state => Faker::Address.us_state_abbr,
          :zipcode => Faker::Address.zip_code,
          :address_type => "Vendor"
          }
      }
    } 
  Vendor.create!(params[:vendor]) 
end

Обратите внимание на [] для массива при работе с has_many.

require 'faker'

Vendor.delete_all
["Company A", "Company B", "Company C", "Company D"].each do |c|
  params = {:vendor => 
      {
        :name => c,
        :contact => Faker::Name.name,
        :phone => Faker::PhoneNumber.phone_number,
        :addresses_attributes => [{
          :street1 => Faker::Address.street_address,
          :city => Faker::Address.city,
          :state => Faker::Address.us_state_abbr,
          :zipcode => Faker::Address.zip_code,
          :address_type => "Vendor"
          }]
      }
    } 
  Vendor.create!(params[:vendor]) 
end

1 Ответ

3 голосов
/ 26 февраля 2011

accepts_nested_attributes_for :foo позволяет создавать формы, которые создают связанные записи. Когда вы создаете вещи в коде, нет необходимости использовать это. Вы можете создавать связанные записи, используя имена ассоциаций вместо "address_attributes". Вот один из способов сделать это, но Rails предоставляет множество способов сделать то же самое ...

["Company A", "Company B", "Company C", "Company D"].each do |c|
  vendor_address = Address.new :street1 => Faker::Address.street_address,
                               :city => Faker::Address.city,
                               :state => Faker::Address.us_state_abbr,
                               :zipcode => Faker::Address.zip_code,
                               :address_type => "Vendor"

  Vendor.create! :name => c,
                 :contact => Faker::Name.name,
                 :phone => Faker::PhoneNumber.phone_number,
                 :addresses => [vendor_address]
end

Если вы хотите попробовать использовать способ вложенных атрибутов, тогда вам не нужна часть :vendor => {} хеша, вы можете перейти прямо к параметрам и вам нужно addresses_attributes, чтобы быть массивом, не хеш.

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