我一直在阅读关于保持控制器变薄以及在模型中完成所有逻辑。虽然这让我感觉与数据库交互,但是不需要进行数据库交互的情况呢?
我的应用中有一个相当复杂的模块,可与多个不同的第三方API进行交互。我对我的控制器使用ajax调用,其中所有数据都是从API收集然后组织的。然后通过相应的.js.erb或.html.erb文件显示它。
这是处理这种情况的正确方法吗?我是铁道新手,不想养成做错事的习惯。
答案 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)
在模型中做模型逻辑。
在控制器中执行控制器逻辑。
模型不需要是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