gpt4 book ai didi

ruby-on-rails - MVC Web 框架中不相关 View 的优雅解决方案是什么?

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

我在 Rails 和 ASP.Net MVC 中遇到了以下问题。页面上通常有多个功能小部件,但一个 Controller 操作应该呈现页面。让我举例说明:

假设我有一个普通的电子商务网站,菜单由类别组成,而页面是显示一组产品。

对于产品,假设我在 Controller 上有一个 Action ,看起来像:

def product_list
@products = Products.find_by_category(:name => 'lawnmowers')
end

我有一个类似的布局
<div id="menu"><%= render :partial => 'menu' %></div>
<div id="content"><%= yield %></div>

产品具有视野...
<%= render :partial => 'product', :collection => @products %>

(请注意,我已将产品 View 视为无关紧要)

菜单有部分......
<% Category.each {|c| %>
<%= render :partial => 'menu_node', :locals => { :category => c } %>
<% } %>

我遇到的问题是 View 中的“Category.each.do”。我在 View 中获取数据,而不是使用在 Controller 中设置和绑定(bind)的变量。它很容易是一个更复杂的方法调用来生成菜单。

我考虑过的解决方案是:

- 一个 View 模型基类,它知道如何获取各种数据。但是您最终可能会为站点的每个概念“部分”使用其中一个。
- 填充在每个方法顶部的局部变量(违反 DRY)
-同样的事情,但在 before_filter 调用中

这些对我来说都不是很优雅。我不禁看到这个问题,并认为每个 View (而不是屏幕)的 MVP 演示者是一个更优雅的解决方案。

ASP.Net MVC 有渲染 Action (不同于 rails render :action),它确实解决了这个问题,但我不确定我对这个解决方案的看法。

想法?解决方案建议?

补充说明:
到目前为止提供的答案是很好的建议。它们适用于我给出的示例,其中菜单可能出现在每个布局中,并且显然次要于产品数据。

但是,如果明显没有二等公民怎么办?门户网站类型的站点通常有多个不相关的小部件,其中每一个都很重要。

例如,如果此页面显示天气趋势,带有温度、湿度和降水的小部件(并且每个都是不同的模型和 View 类型),该怎么办。

最佳答案

在 Rails 中,我们喜欢有一个精简 Controller 、厚模型的概念。所以我认为你不想在 Controller 中设置变量是正确的。

此外,为了稍后启用更复杂的方法,我建议执行以下操作:

/app/controllers/application_controller.rb

before_filter :add_menu_nodes

def add_menu_nodes
@menu_nodes = Category.menu_nodes(current_user)
end

/app/views/layouts/application.html.erb
<%= render :partial=>:menu, :locals=>{:categories=>@menu_nodes} %>

/app/models/category.rb
def self.menu_nodes(current_user)
Category.all.order(:name)
end

这样,如果您需要,将来您可以根据当前用户使用更复杂的解决方案更新 Category.menu_nodes。

关于ruby-on-rails - MVC Web 框架中不相关 View 的优雅解决方案是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3390967/

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