【问题标题】:Rails3 seed data nested attributeRails3 种子数据嵌套属性
【发布时间】:2011-02-26 18:07:56
【问题描述】:

我在这里做错了什么?表单有效,但在尝试播种数据时不断收到“:street1:Symbol 的未定义方法 `to_i'”。

EDIT = 如果我把所有事情都作为一个单一地址(has_one 而不是 has_many)种子工作。

EDIT 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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    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 =&gt; {}部分,你可以直接进入params,你需要addresses_attributes是一个数组,不是哈希。

    【讨论】:

    • 好的,发现您的回复有问题。没有将地址转换为 has_many 的数组。而不是 :addresses_attributes => {..} 它应该是 :addresses_attributes => [{...}]。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多