Как правильно вызывать методы из модели, относящейся к другим контроллерам? - PullRequest
1 голос
/ 23 ноября 2010

В моем приложении 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

... в моей модели профиля (профили.rb) У меня есть это:

...
belongs_to :user
...

before_save :inizialize_profile

private

def inizialize_profile
  @profile_statistic = ProfileStatistic.new
end

Во втором блоке кода в "before_save" он создает новую статистику профиля: "inspecting" @profile_statistic возвращает новый объект (правильно!)

В первом блоке кода в «before_save» не создается новый профиль: «проверка» результатов @user_profile nil (это должен быть новый объект профиля!)

последняя часть моя проблема.Почему это происходит?

1 Ответ

3 голосов
/ 26 ноября 2010

Когда вы вызываете Profile.new, он только создает экземпляр в памяти, он не сохраняется в базе данных и поэтому не имеет атрибута id (т. Е. @ User_profile.id равен nil).

Я предлагаю вам заменить

@user_profile = Profile.new

на

@user_profile = Profile.create

create, чтобы сохранить экземпляр, и тогда @ user_profile.id не будет равен nil.

Возможно, вы также захотите использовать обратные вызовы before_create (не before_save), или у вас будут новые профили пользователей каждый раз, когда вы сохраняете модель (например, после обновления).Кроме того, вы, вероятно, хотите иметь

ProfileStatistic.create

вместо

ProfileStatistic.new
...