首页 > 解决方案 > 用户在控制器中创建对象后运行模型方法

问题描述

我正在寻求解决我面临的问题的帮助。我有一个推荐程序,我想在被推荐的用户创建一个Post. 在我的user.rb文件中,我有:

def complete_referral!
  update(referral_completed_at: Time.zone.now)
end

PostsController有:

def create
  @post = current_user.posts.build(post_params)
  @post.save
end

我尝试过的一些想法是尝试运行 complete_referral!方法post.rb如下:

after_create :complete_referral!

但这只是引发了一个undefined method complete_referral!' for #<Post:0x00007ff65b0514d8>错误。

任何想法,将不胜感激。

标签: ruby-on-railsrubyactiverecord

解决方案


您还可以使用关联回调

class Post < ApplicationRecord
  belongs_to :referrer, class_name: 'User', optional: true
end

class User < ApplicationRecord
  has_many :referred_posts, 
    class_name: 'Post', 
    foreign_key: 'referrer_id',
    after_add: :complete_referral!
end

当您从关联创建帖子时,将调用回调:

@post = User.find(some_param).referred_posts.new(post_params)

我会使用它而不是常规回调的原因是它不会创建从 Post 到 User 的硬依赖关系,当你只想创建一个 post 记录时,你必须在所有测试中解决这个问题。


推荐阅读