【问题标题】:How can I debug seeds.rb file?如何调试 seed.rb 文件?
【发布时间】:2013-06-26 13:22:23
【问题描述】:

我正在尝试使用 seed.rb 文件在我的项目中插入一些默认用户。我在控制台中执行了以下行:

rake db:seed

并没有抛出任何错误,但也没有创建记录。当我将代码粘贴到 rails 控制台时,再次没有显示错误。我猜我在 seed.rb 文件中做错了什么。

这是我的模型的关联方式:


security_user.rb

has_one :security_users_detail, dependent: :destroy
has_many :security_users_manage_securities
has_many :security_users_roles, through: :security_users_manage_securities

security_users_detail.rb

belongs_to :security_user

security_users_role.rb

has_many :security_users_manage_securities
has_many :security_users, through: :security_users_manage_securities

这是我的 seed.rb 文件中的代码:

users = {

   Admin: {

      Information: {
        email: 'test@gmail.com',
        password: 'test',
        password_confirmation: 'test'
      },
      Details: {
        address: 'Not defined.',
        city: 'Not defined.',
        country: 'Not defined.',
        egn: '0000000000',
        faculty_number: '',
        first_name: 'Admin',
        gender: 'male',
        gsm: '0000000000',
        last_name: 'Not defined.',
        skype: 'Not defined.'
      },
      Roles: %w(Administrator)
   }
}

users.each do |user, data|

  security_user = SecurityUser.new(data[:Information])

  data[:Roles].each { |role|
    security_user.security_users_manage_securities.build(security_users_role: SecurityUsersRole.find_by_role(role))
  }

  SecurityUser.where(email: security_user.email).first_or_create!(security_user.attributes)

  security_users_detail = SecurityUsersDetail.new(data[:Details])
  security_users_detail.security_user_id = security_user.id
  SecurityUsersDetail.where(security_user_id:  security_users_detail.security_user_id).first_or_create

end

【问题讨论】:

    标签: ruby-on-rails-3 seed


    【解决方案1】:

    问题是由以下行引起的:

    security_user = SecurityUser.new(data[:Information])
    

    因为即使在新方法中传递的哈希值仅包含电子邮件和密码字段,结果对象也是使用其余模型属性创建的,但设置为 nil。例如,我有 id=>nil

    然后在我做以下事情

    SecurityUser.where(email: security_user.email).first_or_create!(security_user.attributes)
    

    仅当用户存在时才创建用户。无论如何,由于 id 参数不在模型的 attr_accessible 子句中,我无法进行批量分配。

    要删除哈希的 nil 值,我做了以下操作:

     SecurityUser.where(email: security_user.email)
                  .first_or_create!(security_user.attributes
                  .delete_if { |key, value| value.nil? })
    

    【讨论】:

      【解决方案2】:

      seed.rb 是一个 rake 任务,因此您可以使用puts 将消息输出到控制台。例如,

      puts "User name: #{user.name}"
      

      【讨论】:

      • 另外,为了帮助您解决问题,您似乎正在调用new,但从未调用save
      • 是的,我正在调用 first_or_create,如果找不到它,它将创建一条记录。如果我在rails控制台中执行所有代码,记录会插入到数据库中吗?
      • 如果我理解你想要做什么,我认为你在security_user = SecurityUser.new(data[:Information]) 中有一个错误。 data[:Information].present? 是真的吗? (尝试使用puts。)如果没有,您可能需要data[:Admin][:Information]
      • 不,没关系 - 我正在使用哈希值迭代器,数据是 Admin 的哈希。
      • +1 感谢您的帮助,实际上不止一个错误,但我能够清除它们。
      猜你喜欢
      • 2013-06-18
      • 1970-01-01
      • 2011-12-20
      • 2011-08-16
      • 2012-11-27
      • 1970-01-01
      • 2014-05-13
      • 2011-07-30
      • 1970-01-01
      相关资源
      最近更新 更多