如何从与其他控制器相关的模型中正确调用方法?

时间:2010-11-23 20:54:44

标签: ruby-on-rails-3 methods model controller

在我的Ruby on Rails应用程序中,我想为配置文件创建一个新的配置文件和一个新的统计信息,所有这些都首先从用户模型调用相关方法,然后从配置文件模型调用。

所以......

...在我的用户模型中(user.rb)我有这个:

...

has_one :profile

...
before_save :inizialize_user
...

private

def inizialize_user
  @user_profile = Profile.new
  self.user_profile_id = @user_profile.id
end

...在我的个人资料模型中(profiles.rb)我有这个:

...
belongs_to :user
...

before_save :inizialize_profile

private

def inizialize_profile
  @profile_statistic = ProfileStatistic.new
end

在第二个代码块中,在“before_save”上,它实例化一个新的配置文件统计信息: “检查”@profile_statistic会产生一个新对象(正确!)

在第一个代码块中,在“before_save”上,它不会实例化新的配置文件: “检查”@user_profile结果为零(它必须是一个新的配置文件对象!)

最后一部分是我的问题。为什么会这样?

1 个答案:

答案 0 :(得分:3)

当你调用Profile.new时,它只在内存中创建一个实例,它不会保存到数据库中,因此没有id属性(即@ user_profile.id为nil)

我建议你替换

@user_profile = Profile.new

@user_profile = Profile.create

create将保存实例,然后@ user_profile.id将不会为nil。

您可能还想使用before_create回调(不是before_save),或者每次保存模型时都会有新的用户配置文件(例如,在udpating之后)。此外,你可能想要

ProfileStatistic.create

而不是

ProfileStatistic.new