【问题标题】:Properly extract logic from views从视图中正确提取逻辑
【发布时间】:2014-04-02 02:20:17
【问题描述】:

我正在寻找一种更好的方法来设计一些需要在各种模型之间共享大量控制器数据的 Rails 视图。我经常遇到需要将关联与各种其他模型结合起来的场景。想想这个场景(这来自一个游戏):

  1. 一个城市有很多建筑(用户通过city_buildings有很多建筑)
  2. 现在,每个建筑都可以根据需求进行升级。假设为了建造一个消防站,你首先需要有一口井。
  3. 我的应用程序显示了当前建造的建筑物。如果无法构建,它会遍历 @city.buildings 及其要求。

现在,我的问题是在我的控制器/视图中正确处理这些数据。我总是尝试在我的视图中使用尽可能少的代码,并尝试主要在那里使用实例变量。每个建筑物都有不同的要求,这些要求源自关联 building.requirements。我的部分观点取决于这个要求,因此我必须在我的观点中进行这样的检查:

<% if building.fulfil_requirements?(city) %>

过去,我曾尝试使用 SQL 连接来创建实例变量,这些变量具有更多关于关联的信息,也基于其他模型,但我发现这种技术相当混乱。在某些情况下,由于需要在 foreach 循环中计算某些内容,我不得不在视图中运行模型方法,这是我非常不喜欢的。

所以,我想知道是否有更好的解决方案可以在我的视图中组合多个模型行为,而不必在我的视图中添加逻辑。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    所以您希望只显示具有特定要求的建筑物


    模块化

    Rails(和通用 MVC)中有一个称为 fat model skinny controller 的约定,这意味着您应该在模型中包含尽可能多的条件逻辑,并根据需要引用相关的方法/函数

    我建议将您的条件逻辑合并到您的模型中,让您可以简单地从控制器调用所需的数据(以及视图中的输出),如下所示:


    型号

    使用ActiveRecord Association Extensions,但可以使用scope

    #app/models/city.rb
    Class City < ActiveRecord::Base
        has_many :buildings do 
            def fulfil_requirements
                where([requirements])
            end
        end
    end
    

    这使用一个简单的where 调用来根据特定要求提取数据。此数据将传递给您希望的任何变量


    控制器

    #app/controllers/cities_controller.rb
    def show
        @city = City.find(params[:id])
        @buildings = @city.buildings.fulfil_requirements
    end
    

    通过接收条件数据,您只需使用数据分配填充@buildings 变量,然后您可以将其传递给视图


    查看

    #app/views/cities/show.html.erb
    <% @buildings.each do |building| %>
        your code here
    <% end %>
    

    通过仅将所需数据传递给您的视图,您可以操作该数据(不必担心条件)。这使得视图更清晰,系统更模块化

    【讨论】:

    • 嗨 Rich Peck,谢谢您的回答。这不是我想要的。我想展示所有建筑物,包括那些有或没有要求的建筑物。这就是我过去使用连接的原因。当这种情况出现时,我总是遇到问题,因为我还没有找到一种很好的方法来包含这些额外的模型信息,而无需连接或在视图中动态添加评估。
    • 如果是这样的话,你最好在视图中使用逻辑,对吗?
    • 是的,在我看来这是唯一的方法。我只是想确保我没有遗漏任何东西,因为如果我可以从我的视图中删除模型代码,我真的会参与其中。
    猜你喜欢
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2016-06-28
    相关资源
    最近更新 更多