2

我的模型中有一个非常大的功能,我想将它存储在其他地方以保持模型干燥。我读到在 ApplicationHelper 中存储方法然后从模型中调用它们是一个坏主意。那么什么是好主意呢?我想用我的大方法有一个单独的文件,并从模型中调用它们。

4

2 回答 2

2

您可以创建一个“普通的旧红宝石对象 (PORO)”来为您完成工作。假设您有一种方法可以计算用户的逾期金额。

因此,您可以创建 app/services/calculates_overages.rb

class CalculatesOverages
  def initialize(user)
    @user = user
  end

  def calculate
    # your method goes here
  end
end

那么你就可以:

class User < ActiveRecord::Base
  def overage_amount
    CaluclatesOverage.new(self).calculate
  end
end

或者,在控制器中,您可以:

def show
  @amount = CaluclatesOverage.new(current_user).calculate
end

app/services 目录也可以是 app/models 或 lib 目录。这(还)没有固定的约定。

于 2013-01-11T22:20:09.027 回答
0

使用关注点。https://gist.github.com/1014971

这很简单。在app/models/concerns创建文件your_functionality.rb如下:

module YourFunctionality
  extend ActiveSupport::Concern

  def your_fat_method
    # insert...
  end
end

在您的模型中简单地:

include YourFunctionality
于 2013-01-11T22:58:50.253 回答