Rails:允许模型中的不同视图访问控制器

时间:2014-04-01 00:55:33

标签: ruby-on-rails ruby ruby-on-rails-4

我是Rails的新手,我的财务模型有一个RESTful控制器:

finances_controller.rb

  def index
    @finances = Finance.find_all_by_user_id current_user[:id] if current_user
  end

  def spending
    @finances = Finance.find_all_by_user_id current_user[:id] if current_user
  end

这使我可以在 index.html.erb spend.html.erb 上获取我的财务模型。

但是,我还想在这两个中添加一些共享逻辑,例如:

def index
    @finances = Finance.find_all_by_user_id current_user[:id] if current_user

    finance = current_user.finance
    @essentials = finance.rent.to_i +
                  finance.mortgage.to_i +
                  finance.gas.to_i +
                  finance.groceries.to_i +
                  finance.carpayment.to_i +
                  finance.carinsurance.to_i +
                  finance.othertransit.to_i +
                  finance.electric.to_i
  end

这意味着我必须将这个逻辑复制到def index和def花费方法上,这似乎不对。 是否有更好的方法可以通过多种方法共享逻辑来解决这个问题?

1 个答案:

答案 0 :(得分:0)

您可以在Finance上将其设为类方法:

class Finance
  def self.essentials(user)
    finance = user.finance
    finance.rent.to_i +
    finance.mortgage.to_i +
    finance.gas.to_i +
    finance.groceries.to_i +
    finance.carpayment.to_i +
    finance.carinsurance.to_i +
    finance.othertransit.to_i +
    finance.electric.to_i
  end
end

我将实例变量的设置放在before过滤器中:

# controller

before_filter :load_finances, :only => [:index, :spending]
before_filter :load_essentials, :only => [:index, :spending]

def index
end

def spending
end

protected

def load_finances
  @finances = Finance.find_all_by_user_id current_user[:id] if current_user
end

def load_essentials
  @essentials = Finance.essentials(current_user) if current_user
end