我一直在读关于保持控制器瘦和在模型中做所有逻辑的文章。虽然这对我来说与数据库交互是有意义的,但是在不需要与数据库交互的情况下呢?
我有一个相当复杂的模块在我的应用程序,与几个不同的第三方api交互。我对我的控制器使用ajax调用,从api收集所有数据,然后对其进行组织。然后通过相应的.js显示它。动词或。html。erb文件。
这是处理这种情况的正确方法吗?我是rails新手,不想养成做错事的习惯。
模型不仅仅是用来处理数据库的,原则上也是用来处理数据的。
由于我们不知道你指的是什么情况,我可以列举一些情况。
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
所以你可以看到你可以在你的控制器中计算它,但它应该在你的模型中计算,所以它是可重用的和干净的解决方案。
另一个例子是使用一些虚拟属性。的名字。可以将第一个、第二个和第三个名称存储在不同的列中,因此需要将它们连接起来。您可以在控制器中创建私有方法,但这当然不是一个好主意。
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
等等
在模型中执行模型逻辑。
- 保持联系。
- 维护复杂属性
- 维护验证。
- 代表商业/行业的概念。
在控制器中执行控制器逻辑。
- 检查用户是否被授权修改资源。
- 提取和聚合数据以传递到视图模板中。
- 查找正确的视图模板
- 为API响应编写json。
- 重试失败的保存。
模型不需要是ActiveRecord
s。您可以使用模型(应用程序的"核心")做很多与持久性无关的事情。只是不要把控制器逻辑放到这些模型中。
这个问题问得好。
即使你不需要使用数据库,你仍然可以采用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