gpt4 book ai didi

ruby-on-rails - 在 rails 中拥有丰富的 View 是不是很糟糕?

转载 作者:行者123 更新时间:2023-12-04 02:41:02 25 4
gpt4 key购买 nike

我有一个 RESTful Controller ,负责构建许多不同的模型。这意味着任何给定的 View 都需要设置一些变量才能正确呈现。如果我在 Controller 中设置这些变量,则必须在可能呈现该 View 的不同操作之间复制代码。例如,呈现第 1 页需要 5 个变量。如果显示、创建和更新所有渲染 View ,那么设置这 5 个变量的代码将在这些 Controller 操作中重复。另一种方法是将所有代码放在 View 中。但这可能会变得非常丑陋:

<% variable1 = Model1.where(some conditions) %>
<% variable2 = Model2.where(some other conditions) %>
<% variable3 = Model3.where(some third conditions) %>

我对这个解决方案犹豫不决,因为有多少代码进入了 View 。我一直遵循 View 中的代码不应该触及数据库的原则。我喜欢的另一种方法是创建专注于设置变量和呈现 View 的私有(private)方法。所有需要渲染的 Action 都可以调用这个方法。

最佳答案

在我看来,你所有的逻辑都应该放在你的 Controller 、模型、助手或库中。在您的情况下,设置变量应该在您的 Controller 中完成,而不是在您的 View 中完成。

将您的逻辑放在合适的地方真的很有趣,因为如果您的代码放在合适的地方,调试、维护或重构您的应用程序会更容易。

因此,这里有一些想法可以将您的变量声明放入您的 Controller 中,而不会重复您的代码:)

before_action(在 Controller 中)

您可以在 Controller 中使用 before_action。它将减少重复代码。

例如,你可以这样做:

before_action :set_variables

def set_variables
@var1 = some_code
@var2 = other_code
...
end

您可以使用 onlyexcept 将 before_action 限制为仅特定操作

before_action :set_variables, only: [:index, :edit]

这只会在索引和编辑之前调用 set_variables

before_action(在 application_controller.rb 中)

例如,如果您想为每个 Controller 中的所有索引操作添加一个 before_action,您只需在 application_controller.rb 中执行一个 before_action

而如果你想在特定的 Controller 中跳过这种类型的before_action,你可以使用skip_before_action方法。

# application_controller.rb
before_action :set_variables, only: :index

# specific_controller.rb
skip_before_action :set_variables

还有一件事:模型作用域

然后,结束前的最后一件事:Model1.where(some conditions)。模型范围呢?

您的代码将更具可读性并减少重复:

class MyModel < ActiveRecord::Base
scope :active, -> { where(is_active: true) }
end

MyModel.active # equivalent to MyModel.where(is_active: true)

关于ruby-on-rails - 在 rails 中拥有丰富的 View 是不是很糟糕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19941919/

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