提问人:aj soprano 提问时间:7/13/2022 更新时间:7/13/2022 访问量:451
从其他控制器调用模型方法的 Rails 最佳实践
Rails best practice for calling a model method from a different controller
问:
我有 和 。我有一种方法,我想打电话给.但我不确定这样做的最佳做法是什么。这是我现在的方法:Model_a
model_a_controller
Model_b
model_b
model_a_controller
def method
id = Model_b.method
.... some other stuff
end
我直接从模型调用该方法,但是也许制作模型的实例然后从该实例调用该方法是否更好?类似的东西
def method
@model_b = Model_b
id = @model_b.method
.... some other stuff
end
我不太确定最佳实践是什么,或者我的替代方案是否有意义;欢迎任何指点。
答:
这取决于您想要实现的目标以及背景是什么。我只能回答一些快速的指导性问题,这些问题可能是你自己决策的起点。
我在您的问题中看到两个不同的线程:
类方法与实例方法为此,在哪里调用 .这是关于它的逻辑和责任。这个方法应该做什么?您需要一个实例(例如)吗?或者它是仅与类或所有模型 B 实例相关的行为(例如)?想想这种方法的结果以及实现它需要什么。
method_b
Model B
@instance_B.valid?
Model_B.count
在哪里打电话
method_b
根据经验,在轨道上,一个好的做法是保持纤细的控制器。 和 之间有什么关系吗?那么可能最好将 .也许您应该考虑为此添加服务层?https://www.toptal.com/ruby-on-rails/rails-service-objects-tutorial考虑模型和控制器操作之间的关系。model A
model B
method_b
model A
没有总是有效的严格规则。这取决于业务环境、应用程序设计和开发方向。 如果您提供更具体的例子,那么我们可以给出更具体的建议,并讨论不同方法的利弊。
也许你可以创建一个这样的服务对象:
在应用程序中,创建一个文件夹 services(app/services
)
在 services 文件夹中,您可以组织项目的所有服务。
services/model_b_service/model_b_method.rb
module ModelBService
class ModelBMethod
def initialize
end
def call
.. logic goes here
end
end
因此,在您的控制器中:
def method
id = ModelBService::ModelBMethod.new.call
.... some other stuff
end
如果您只想传递参数并在 initialize 方法中获取ModelBService::ModelBMethod.new(args).call
评论
Model_b