2011-04-22 87 views
5

我一直在阅读关于保持控制器精简并在模型中执行所有逻辑的知识。虽然这让我感觉与数据库进行交互,但那些不需要进行数据库交互的情况呢?控制器中的Rails逻辑?

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

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

回答

6

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

只要我们不知道你的意思是什么情况,我只能提出一些情况。

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 

所以你可以看到,你可以计算出它的权利在你的控制器,但它应该在你的模型来计算,所以它是可重复使用的,干净的解决方案。

另一个例子是使用一些虚拟属性。名称。您可以将第一,第二和第三个名称存储在不同的列中,因此您需要加入它。你可以在控制器中创建私有方法,但当然这是个坏主意。对等

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

等等

+0

谢谢,这清除了一些东西。 – Patm 2011-04-22 19:56:55

2

这是一个很好的问题:

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

所以,你可以随处在你的项目中调用它。

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

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

在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 
3

在模型中执行模型逻辑。

  • 维护关联。
  • 保持复杂的属性。
  • 保持验证。
  • 代表来自企业/行业的概念。

控制器中的控制器逻辑。

  • 检查用户是否有权修改资源。
  • 拉取并聚合要传入视图模板的数据。
  • 找到正确的视图模板。
  • 为API响应编写json。
  • 重试失败保存。

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

相关问题