【问题标题】:Rails 4 - Best practices - How to display a view with data from different controllers?Rails 4 - 最佳实践 - 如何显示来自不同控制器的数据的视图?
【发布时间】:2015-01-12 13:13:34
【问题描述】:

我正在构建一个 Rails 4 应用程序。

该应用程序用于记录大量客户的网络硬件设备(IT 咨询企业会使用的应用程序)。第一个索引视图是列出所有客户端的视图。此时,您可以单击链接以查看特定于该客户的项目。我已经为我正在记录的不同类型的东西(即服务器控制器、防火墙控制器等)构建了不同的模型和控制器。

我已经到了嵌套的地步,我可以从客户端索引页面获取链接以传递 client.id 并在该特定控制器上查看与该客户端关联的项目(即它将列出所有服务器那个客户)。现在,当您在那里时,我希望它还列出来自不同型号/控制器的所有其他项目。我想要一页显示来自不同模型/控制器的数据。

我正在尝试确定此类场景的最佳做法。我觉得我错过了显而易见的事情,Rails 以某种特定的方式处理这个问题 - 或者 - 大多数人说 Rails 很烂/不这样做,每个人都做 X 来完成这项任务。

以下是我的想法,排名不分先后:

  1. 使用分部 - 据我了解,分部似乎不合适,是为了简化您的视图代码
  2. 渲染 - 这里关心的是如何传递 ID 以获取正确的客户端
  3. 在控制器中嵌套/在操作之前使用以设置 client.id,然后为所有其他控制器编写带有实例变量的索引操作。已经为嵌套执行此操作并且它有效,但仅适用于包含 client.id 的原始请求链接。我不知道如何将 client.id 传递给其他实例变量,以便显示正确的数据。我觉得我可以修复这个错误,但我似乎走错了路。
  4. 真正实现动态内容的 JavaScrip/AJAX 类型的解决方案??

我想确保我以良好的老式 DRY 意义进行此操作。

【问题讨论】:

    标签: javascript ruby-on-rails ajax ruby-on-rails-4 model-view-controller


    【解决方案1】:

    让我们先列出一些基础知识,无论您只有一个页面包含所有内容还是多页面,这取决于用户体验和您要实现的逻辑。

    你的流量是

    • 列出客户的索引操作

      controller:clients_controller,action:index

    • 索引项目、服务器或其他任何东西

      controller:items_controller,action:通过链接传递 client_id 的索引

    例如:

    link_to client.name, items_path(client_id: client.id) // this will pass params[:client_id] to the action you are requesting and you can add more if you want.
    
    • 使用 before_action 在开始执行您的操作之前做一些事情,或将常见行为强制到一堆操作中以避免重复您的代码并使其可读。

    • Ajax 和 Jquery 将帮助您在服务器响应后更改页面的任何部分,以便您可以创建 div 并为其赋予唯一 id ex "#{params[:client_id]}_items_div " 并在您的回复部分 .js 中使用 $("#DIV_ID").html("YOUR RESPONSE DATA OR RENDER PARTIAL")

    • 将您的文件保存在其相应的文件夹中,如果您有一个列出服务器的部分,请将其放在 views/servers/index.html.haml 或任何扩展名下。这将帮助您快速找到想要的东西并帮助他人。

    有很多方法可以做您正在寻找的事情,但要遵循约定以在您的项目上帮助他人。

    【讨论】:

      【解决方案2】:

      因此,您所描述的内容类似于仪表板。没有单一的“最佳”方法来处理这个问题,但这是我会做的。

      您的控制器应该定义您将在视图中使用的对象。现在我怀疑你正在使用像servers_controller.rb 这样的东西,它只是定义@servers。如果您的视图需要其他模型,只需在您的操作中定义它们。假设您需要列出除服务器之外的防火墙。继续添加@firewalls = Firewall.where(client_id: client_id) 或类似的内容。只要确保您没有开始在控制器中添加业务逻辑即可。

      一旦定义了其他变量,您就可以在视图中访问它们。如果你想对它保持干燥,你可以为你的仪表板部分创建一个目录(假设你计划在其他地方重用相同的视图)。然后您可以使用<%= render "dashboard/firewalls", firewalls: @firewalls %> 渲染该部分并将其传递给您的@firewall 变量。

      这只是基于您提供的设置的一个想法。

      【讨论】:

      • 没错,一个仪表板。非常感谢。这是我的后续问题,我避免使用术语“简单的 Rails 应用程序”,但除了 CRUD 之外,我的应用程序的好处在于 UI/UX 方面的简单性。 IE。 IT 现场工程师因不记录东西而臭名昭著。如果所有项目都将列在一个控制器下,那么其他控制器现在对我来说似乎有点没用。我知道我要求您在这里冒险,但是通常哪些业务逻辑会超出此范围?
      • 几年前我真的陷入了同样的问题。我希望您仍然需要深入到单个服务器、单个防火墙或单个网络。如果是这种情况,您可能仍然需要许多 CRUD 控制器。但是,如果您认为某事毫无意义,请不要试图证明保留它的合理性。
      • 您的控制器操作不应该包含一堆用于保存/加载数据的逻辑,它们应该调用其他东西来处理它(可能是服务对象)。这样,您可以让不同的控制器在保持 DRY 的同时保存相似的数据。您将花费大量时间尝试找到正确的解决方案,并且您可能会完全满意,直到您一遍又一遍地完成它。考虑研究演示者模式,除非你真的觉得它们会有所帮助,否则不要使用它们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 2020-10-18
      • 1970-01-01
      相关资源
      最近更新 更多