从视图中正确提取逻辑

时间:2014-02-28 21:20:39

标签: ruby-on-rails

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

  1. 一个城市有许多建筑物(用户通过city_buildings有许多建筑物)
  2. 现在,每个建筑都可以根据要求进行升级。让我们说,为了建立一个消防站,你首先需要有一个井。
  3. 我的应用程序显示了当前建造的建筑物。如果无法构建,它会遍历@ city.buildings及其要求。
  4. 现在,我的问题是在我的控制器/视图中正确处理这些数据。我总是尝试尽可能少地使用我的视图中的代码,并尝试主要使用实例变量。每个建筑物都有不同的要求,这些要求源于协会建筑。要求。我的部分观点取决于这个要求,因此我必须在我的观点中进行这样的检查:

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

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

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

1 个答案:

答案 0 :(得分:0)

因此,您希望仅显示具有特定要求的建筑物


<强>模块化

在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 %>

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