模型回调抛出错误(after_create)

时间:2014-08-31 11:56:22

标签: ruby-on-rails activerecord

为什么这不是保存价值?

每次创建新用户时,都应设置默认设置并在设置模型中创建条目。 如果我手动创建用户/设置关联,则效果非常好。通过 psql rails c

class User < ActiveRecord::Base
      after_create do
        if self.setting.nil? # check if user got settings most likely not
          # call settings model and create new default settings
          Setting.create(:user_id => self.id, :foo => "bar", :baz => true)
        end
      end
end

是的,名称也是正确的,例如,如果我为用户创建设置,并且我想查询我必须使用的用户设置:

current_user.setting.language

这在某种程度上是愚蠢的,因为它应该是复数但是它有效,所以不要担心我的回调中的任何命名约定或简单拼写错误。

实际上它实际上不是一个错误,但价值只是没有得到保存。 这是过程:

用户创建一个新帐户,此回调应在设置页面上创建默认设置,有一个div需要设置ID,如下所示:

    <h2 data-settings_id="<%= current_user.setting.id %>" id="current_user" data-user="<%= current_user.id %>">Settings </h2>

如果我手动创建设置,此页面工作正常 - 所以我猜回调没有创建任何设置,因为我收到此错误:

undefined method `id' for nil:NilClass

注意: 我使用设计,我不想覆盖任何这些类。 如何解决这个问题?感谢

1 个答案:

答案 0 :(得分:0)

我认为问题出在你的回调条件中:

self.setting.nil?

由于setting是一种关系,它应该返回一个 ActiveRecord :: Associations :: CollectionProxy 对象,它非常像Array并且用nil?检查始终返回false,您需要与blank?核对。

这样的事情应该有效:

class User < ActiveRecord::Base
  after_create do
    if self.setting.blank? # check if user got settings most likely not
      # call settings model and create new default settings
      self.setting.create(:foo => "bar", :baz => true) # user_id will be set for us since we initiated the new object using the relation
    end
  end
end