控制器中的Rails Logic?

时间:2011-04-22 19:09:44

标签: ruby-on-rails ruby-on-rails-3

我一直在阅读关于保持控制器变薄以及在模型中完成所有逻辑。虽然这让我感觉与数据库交互,但是不需要进行数据库交互的情况呢?

我的应用中有一个相当复杂的模块,可与多个不同的第三方API进行交互。我对我的控制器使用ajax调用,其中所有数据都是从API收集然后组织的。然后通过相应的.js.erb或.html.erb文件显示它。

这是处理这种情况的正确方法吗?我是铁道新手,不想养成做错事的习惯。

3 个答案:

答案 0 :(得分:7)

模型不仅适用于处理数据库,还适用于原则上处理数据。

至于我们不知道你的意思是什么,我可以提出一些情况。

Ajax调用大数学计算。它没有触及数据库,甚至可以在无表格模型中进行计算。

# in your controller
def calculating
  Calculator.get_integral_log_and_furie params[:data]
end
# in your model
class Calculator
  def self.get_integral_log_and_furie(data)
    ... # multi line code
  end
end

所以你可以看到你可以在你的控制器中正确计算它,但它应该在你的模型中计算,因此它是可重复使用的清洁解决方案。

另一个例子是使用一些虚拟属性。名称。您可以在saparate列中存储第一个,第二个和第三个名称,因此您需要加入它。你可以在controler中创建privae方法,但当然这是个坏主意。

class User < AR::Base
  def full_name
    [first_name, second_name, third_name].compact.join(" ")
  end
end

所以你可以在项目的任何地方调用它:

@user.full_name
# Peter Jhonson, or mu is too short

依旧等等

答案 1 :(得分:4)

在模型中做模型逻辑。

  • 维护协会。
  • 维护复杂的属性。
  • 维持验证。
  • 代表商业/行业的概念。

在控制器中执行控制器逻辑。

  • 检查用户是否有权修改资源。
  • 拉取并汇总数据以传递到视图模板。
  • 找到正确的视图模板。
  • 撰写json以获取API响应。
  • 重试失败的保存。

模型不需要是ActiveRecord。你可以用模型做很多事情 - 你的应用程序的“核心” - 与持久性无关。只是不要将控制器逻辑放入这些模型中。

答案 2 :(得分:2)

这是一个很好的问题。

即使您不需要使用数据库,您仍然可以采用OOP / MVC方法来组织代码并将数据,逻辑和行为包装在模型中。

模型对象中的代码组织和封装仍然有用&amp;重要!

在Rails 3中,您可以通过仅包含ActiveRecord包含的一些ActiveModel模块来创建非持久模型。例如:

# This class exists as a fairly simple DTO that is not expected to be persisted, but 
# it does have validation, attributes & a hash constructor, just like ActiveRecord models
class MyProduct
  include ActiveModel::Conversion
  include ActiveModel::Naming
  include ActiveModel::Validations

  attr_accessor :title, :quantity

  validates :title, :quantity, :presence => true
  validates :quantity, :numericality => {:greater_than_or_equal_to => 1}

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end

  def persisted?
    false
  end
end