Ruby on rails 在用户在控制器中创建对象后运行模型方法

Ruby on rails 在用户在控制器中创建对象后运行模型方法,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我正在寻求帮助解决我面临的一个问题。我有一个推荐程序,我想在被推荐的用户创建帖子时运行一个方法。在我的user.rb文件中,我有: def完全推荐! 更新Ferral_已完成于:Time.zone.now 终止 我的PostsController有: def创建 @post=当前_user.posts.buildpost_参数 @邮政储蓄 终止 我尝试过的一些想法是尝试运行完整的推荐!在post.rb上的方法类似于: 创建后:完成推荐 但这只是提出了一个未定义的方法“完全引用!”因为错误 如果您

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

def完全推荐! 更新Ferral_已完成于:Time.zone.now 终止 我的PostsController有:

def创建 @post=当前_user.posts.buildpost_参数 @邮政储蓄 终止 我尝试过的一些想法是尝试运行完整的推荐!在post.rb上的方法类似于:

创建后:完成推荐

但这只是提出了一个未定义的方法“完全引用!”因为错误


如果您有任何想法,我们将不胜感激。

您需要在Post类中定义回调,例如

class Post < ApplicationRecord
  after_create :complete_referral!
  # ...

  private
  def complete_referral!
    user.complete_referral!
  end
end


您需要在Post类中定义回调,例如

class Post < ApplicationRecord
  after_create :complete_referral!
  # ...

  private
  def complete_referral!
    user.complete_referral!
  end
end

您还可以使用:

我之所以使用它而不是常规回调,是因为当您只想创建Post记录时,它不会创建Post与用户之间的硬依赖关系,而您必须在所有测试中解决该依赖关系

您也可以使用:


我之所以使用它而不是常规回调,是因为当您只想创建Post记录时,它不会创建Post与用户之间的硬依赖关系,而您必须在所有测试中解决该依赖关系

其他答案使用回调,我喜欢模型中的回调,如果回调是保持数据处于正确状态所必需的话。在这种情况下,我更愿意在控制器中执行此操作,因为只有当用户通过控制器保存帖子时,我们才希望调用complete_Reference!在用户上,而不是在测试、控制台或导入等中创建post时

因此,在这种情况下,我们在PostsController中编写

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

其他答案使用回调,我喜欢模型中的回调,如果回调是保持数据处于正确状态所必需的话。在这种情况下,我更愿意在控制器中执行此操作,因为只有当用户通过控制器保存帖子时,我们才希望调用complete_Reference!在用户上,而不是在测试、控制台或导入等中创建post时

因此,在这种情况下,我们在PostsController中编写

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


啊,很明显。谢谢是否有一种方法可以在PostsController中使用它,而不是在模型本身中使用它?定义完整的推荐!作为自我推荐。完成推荐!创建您在PostsController中发布的私有方法会产生未定义的局部变量或用户方法,这是什么意思?SuperPost和用户之间有关系吗?它叫什么名字?啊,很明显。谢谢是否有一种方法可以在PostsController中使用它,而不是在模型本身中使用它?定义完整的推荐!作为自我推荐。完成推荐!创建您在PostsController中发布的私有方法会产生未定义的局部变量或用户方法,这是什么意思?SuperPost和用户之间有关系吗?它是如何调用的?您可以在post模型中而不是在用户模型中这样做,因此请转到post.rb并将其添加到引用用户的文件中。您可以在post模型中而不是在用户模型中这样做,因此请转到post.rb并将其添加到引用用户的文件中。谢谢!似乎我想用一些东西,比如除非当前用户使用after\u create,不幸的是,这不太管用。您将如何处理这个问题,而不是使用PostsController使用Post模型?我不确定我是否理解您的要求@post=User.findsome_param.referenced_posts.newpost_params是您将在PostsControllercreate方法中执行的操作。如果您想有条件地执行此操作,如果有当前用户,您可以执行@post=current\u user?当前用户。已引用帖子。newpost参数:Post.newpost参数。谢谢!似乎我想用一些东西,比如除非当前用户使用after\u create,不幸的是,这不太管用。您将如何处理这个问题,而不是使用PostsController使用Post模型?我不确定我是否理解您的要求@post=User.findsome_param.referenced_posts.newpost_params是您将在PostsControllercreate方法中执行的操作。如果您想有条件地执行此操作,如果有当前用户,您可以执行@post=current\u user?当前_user.referenced_posts.newpost_params:Post.newpost_params。您在示例中没有检查save的返回值,这有点挫败了您的论点。谢谢您,这非常有效!设法将其添加到控制器,现在它运行完整的\u引用!仅在已被推荐的用户上当前用户。完成推荐!除非current_user&¤t_user.referenced_by_id.nil?@max绝对是好的观点,当然我只是简单地扩展了OP的示例,我假设他们的代码中也有错误处理,并简化了这个示例的代码-通常,引用系统更复杂。但是我相应地编辑了代码。你有点挫败了你的整个观点
通过不检查示例中save的返回值来进行参数设置。谢谢,这非常有效!设法将其添加到控制器,现在它运行完整的\u引用!仅在已被推荐的用户上当前用户。完成推荐!除非current_user&¤t_user.referenced_by_id.nil?@max绝对是好的观点,当然我只是简单地扩展了OP的示例,我假设他们的代码中也有错误处理,并简化了这个示例的代码-通常,引用系统更复杂。但我相应地编辑了代码。