gpt4 book ai didi

ruby-on-rails - 条件 View /布局

转载 作者:行者123 更新时间:2023-12-04 07:08:10 26 4
gpt4 key购买 nike

假设有一个产品 Controller ,您想要一个索引(列出产品)操作。简单的。现在假设您有一个管理员并在您的项目中存储部件。两者都需要列出产品,但方式略有不同(例如,商店不应该有这个编辑产品链接)。他们还使用不同的布局。

到目前为止,我的想法是在不同的命名空间下拥有两个产品 Controller - app/controllers/admin/products_controller.rbapp/controllers/store/products_controller.rb - 每个都有自己的 View 和布局。但我怀疑这可能会导致 WET 代码。或对其他 Controller View 的引用(imo 破坏了模块化,因此应该避免)。

那么,实际的问题是:是否有更干燥(或实际上正确)的方式来实现上述目标?

我不确定标题是否真的反射(reflect)了这个问题。但是,另一方面,如果是的话,我可能可以用谷歌搜索答案。

编辑
从 3.1 开始,Rails 支持模板继承。

最佳答案

如果您在管理部分和商店部分之间显示产品的方式是不变的,除了管理链接(创建、编辑、销毁),那么我认为为您的产品创建一个部分是最简单的。我假设您有办法判断用户是否是管理员(为了简单起见,我将只使用 admin? 下面)。在你的局部你做这样的事情......

<div class="product">
<div class="productheader">
<%=h product.title %>
</div>
<div class="productdescription>
<%=h product.description %>
</div>
<% if admin? %>
<div class="productadmin">
<%= link_to "Delete", destroy_product_url %>
<%= link_to "Edit", edit_product_url %>
</div>
<% end %>
</div>

请务必将此部分命名为 _product.html.erb(下划线告诉 rails 该模板是部分模板)。在应用程序的 app/views 目录中创建一个名为 shared 的文件夹,并将部分内容存储在那里。

要在其他 View 中渲染此部分,只需调用 render 方法并传递部分参数。

单品:
<%= render(:partial => "shared/product", :object => @a_product) %>

多种产品:
<%= render(:partial => "shared/product", :collection => @products) %>

通过添加布局参数,可以将布局应用于局部。部分布局必须以下划线为前缀,但存储在与 Controller 关联的 app/views 目录中。
<%= render(:partial => "shared/product", :object => @a_product, :layout => "somelayout" %>

关于ruby-on-rails - 条件 View /布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/790693/

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