gpt4 book ai didi

ruby-on-rails - 这种更改实例变量的方法是否属于我的 Rails Controller 或模型?

转载 作者:太空宇宙 更新时间:2023-11-03 18:09:33 25 4
gpt4 key购买 nike

我有一个关于 Controller 和实例变量的基本“最佳实践”问题。

假设您在 Controller 中有一个新的或更新操作的实例变量,可以通过 Controller 中的私有(private)方法修改该实例变量吗?还是该方法应该存在于模型中?

例如在下面的这个例子中,我需要遍历一个实例变量的属性,并添加或删除一些东西。例如,如果我使用 3 层深的嵌套属性并且必须删除某些属性,更改它们然后再将它们添加回去。我知道这可能看起来很奇怪,但假设这是必要的。

def new
@some_thing = SomeThing.new(:some_params)
do_something_to_inst_var # method call
@some_thing.save
end

private

def do_something_to_inst_var
@some_thing.addresses.each do |address|
# modify it in some way
end
end

或者这是不好的做法?这应该是模型中的一个方法并且应该像这样调用:

@some_thing.do_something_to_inst_var

我们是否应该显式地将实例变量传递给方法:

def new
@some_thing = SomeThing.new(:some_params)
do_something_to_inst_var(@some_thing) # method call
@some_thing.save
end

private

def do_something_to_inst_var(some_thing)
some_thing.addresses.each do |addresses|
# modify it in some way
end
end

我在这里寻求一些清晰度,如果可能的话,请举一个例子。我仍在学习和努力改进,但我没有通过搜索找到答案。

最佳答案

Rails 应用程序应该有 "thin controllers" and "fat models"出于几个原因:

  • 每个对象应该只处理它自己的职责。 Controller 应该只是连接网络、模型和 View ,多亏了 Rails,这不需要太多代码。如果一个 Controller 方法重复引用同一模型的方法,它就错误地承担了模型责任;我们说它不是 cohesive或者它有 "Feature Envy" .更有可能的是,如果模型发生变化, Controller 将不得不并行变化。

  • 测试模型比测试 Controller 更容易。

通过在模型中编写一个方法来修复它,该方法执行特定于模型的工作并在 Controller 中调用它(您的第二个选项)。 (最终你的模型会变得太胖,你也必须将它分解,但那是另一回事了。)例如:

class SomeThingsController
def new
@some_thing = SomeThing.new(:some_params)
@some_thing.do_something # method call
@some_thing.save
end
end

class SomeThing
def do_something
addresses.each do |address|
# modify it in some way
end
end
end

关于实例变量。

  • 仅在必要时定义它们。据推测, View 需要您的示例中的那个。

  • 假设实例变量完全合理,就没有理由不在包含它的类的私有(private)方法中引用它。这就是他们的目的。所以你的第一个选项(直接引用实例变量)比你的第三个选项(传入)好一点。但是,如上所述,提取模型方法优于其他两个选项。

关于ruby-on-rails - 这种更改实例变量的方法是否属于我的 Rails Controller 或模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37173619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com