Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Run方法取决于调用它的模型或路径_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails Run方法取决于调用它的模型或路径

Ruby on rails Run方法取决于调用它的模型或路径,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我的应用程序中有交易和账户模型交易属于:账户且账户有多个:交易 当用户创建交易时,应用程序使用 after_create :add_to_account 在Account模型中,我有after_update方法,但只有当用户自己更新帐户时,我才需要运行它,而不需要创建事务 因此,我需要运行此方法,仅当它是从accounts\u path调用时,或者除非它是从transactions\u path或Transaction模型调用时。如何使用if语句实现它 谢谢你的帮助 更新(如果有人有相同的问题

我的应用程序中有
交易
账户
模型<代码>交易属于:账户且
账户有多个:交易

当用户创建交易时,应用程序使用

after_create :add_to_account
Account
模型中,我有
after_update
方法,但只有当用户自己更新帐户时,我才需要运行它,而不需要创建事务

因此,我需要运行此方法,仅当它是从
accounts\u path
调用时,或者除非它是从
transactions\u path
Transaction
模型调用时。如何使用if语句实现它

谢谢你的帮助

更新(如果有人有相同的问题)

bbozo的方法可行,但可能我对问题的描述不清楚:在
交易
中创建后的
方法没有问题,问题是在
账户
模型中更新
后的
方法。因此,解决方案是:

class Account
  attr_accessor :initiated_by_user
  after_update :run_it_only_when_it_was_initiated_by_user

  private

  def run_it_only_when_it_was_initiated_by_user
    if initiated_by_user
      ..
    end
  end

end
以及在
账户\控制器中

def update
  @account = current_user.accounts.find(params[:id])
  @account.initiated_by_user = true
  ...
end
然后在控制器中

t = Transaction.new(params[:transaction].permit(foo etc etc))
t.initiated_by_user = true
#...

这是一个非常糟糕的设计:添加attr_访问器来尝试拆分逻辑菜单,因为您的代码迫切需要服务objects@apneadiving,我大致上同意,但在这种情况下,我不同意。如果您希望每次成员自己输入trx时都发生一些事情,那么该代码段最好放在模型中,然后放在服务类中。出于责任原因,金融交易设计推理会将该属性放在数据库中,而不是放在属性访问器中。OP只是从“我如何绕过这个”的角度来看待问题,但知道谁发起了交易的问题通常比简单的“我应该执行回调吗?”@apheading,但是是的,一旦控制器开始变大或特殊验证器开始出现,我会将控制器逻辑提取到一个表单类中,但我会将该模型作为财务逻辑的一部分保留在模型中,或在我的应用程序中非常接近它,我需要交易和账户协同工作,因此账户余额的每一次变化都必须有一笔交易,这就解释了这种变化。这对于金融应用程序逻辑是必要的。所以当用户创建事务时,它会更新帐户,但当用户自己更新帐户时,我需要创建事务,这解释了这种变化。这种逻辑形成了一个无限循环,创建新事务并更新它们的帐户。我需要打破这个循环,所以我需要告诉Rails不要创建“解释”事务,如果它已经存在的话。有更好的方法吗?您的因果逻辑不正确,交易需要是帐户余额变化的原因,而不是相反。基本上,您应该在事务的“创建后/保存后”上设置帐户余额更新,成员更新其余额的操作不应该是余额更新,而是导致余额更新的新事务,我可以理解吗?:)
t = Transaction.new(params[:transaction].permit(foo etc etc))
t.initiated_by_user = true
#...