我一直在阅读关于保持控制器精简并在模型中执行所有逻辑的知识。虽然这让我感觉与数据库进行交互,但那些不需要进行数据库交互的情况呢?控制器中的Rails逻辑?
我的应用程序中有一个相当复杂的模块,它与几个不同的第三方API进行交互。我使用ajax调用我的控制器,所有数据都从API中收集,然后组织。然后通过相应的.js.erb或.html.erb文件显示。
这是处理这种情况的正确方法吗?我是新手,不想养成做错事的习惯。
我一直在阅读关于保持控制器精简并在模型中执行所有逻辑的知识。虽然这让我感觉与数据库进行交互,但那些不需要进行数据库交互的情况呢?控制器中的Rails逻辑?
我的应用程序中有一个相当复杂的模块,它与几个不同的第三方API进行交互。我使用ajax调用我的控制器,所有数据都从API中收集,然后组织。然后通过相应的.js.erb或.html.erb文件显示。
这是处理这种情况的正确方法吗?我是新手,不想养成做错事的习惯。
模型不仅仅是用于处理数据库,而是用于原则上处理数据。
只要我们不知道你的意思是什么情况,我只能提出一些情况。
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
等等
这是一个很好的问题:
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
在模型中执行模型逻辑。
控制器中的控制器逻辑。
型号不需要是ActiveRecord
s。你可以用模型做很多事情 - 你的应用程序的“核心” - 这与持久性无关。不要将控制器逻辑放入这些模型中。
谢谢,这清除了一些东西。 – Patm 2011-04-22 19:56:55