gpt4 book ai didi

ruby-on-rails - 从共享的局部 View 或替代解决方案中删除条件逻辑

转载 作者:数据小太阳 更新时间:2023-10-29 07:52:19 24 4
gpt4 key购买 nike

对于当前项目,我在 View 之间有重复代码,我不确定重构它的最佳途径。

我似乎处于可以在各种 .html.erb 文件中拥有重复代码的位置,或者我可以将相同的代码放入部分并使用条件语句。我一直听说逻辑应该远离 View 。这两种选择似乎都不理想,而且我目前不知道有其他选择。

为了说明我的问题,我创建了一个名为 animals 的简单 Rails 应用程序。我搭建了两种模型:一种用于 cat,一种用于 dog。图像显示其相应的属性: enter image description here Dogs

显示 @cats@dogs 几乎是一样的。 Cats 只有一列用于 meowsDogs 有一列用于 barks 和一只 dogplays_catch 的附加属性列。

假设我们选择通过创建部分共享 View 来减少显示猫和狗的重复代码:

#views/shared/_animal.html.erb
<tr>
<td><%= animal.name %></td>
<td><%= animal.age %> </td>
<% if animal.class == Cat %>
<td><%= animal.meows %> </td>
<% end %>
<% if animal.class == Dog %>
<td><%= animal.barks %> </td>
<td><%= animal.plays_catch %> </td>
<% end %>
</tr>

然后渲染@cats = Cat.all:

<%= render partial: "shared/animal", collection: @cats %>

然后渲染@dogs = Dog.all:

<%= render partial: "shared/animal", collection: @dogs %>

显然,对于这个特定的例子做这样的事情会有点矫枉过正,但我​​将它应用于现实世界的项目不会矫枉过正。

总体问题是:您如何删除几乎相同的迭代集合的代码,其中唯一的区别是添加/删除一列信息?将逻辑放在 View 本身中感觉不对,而留下重复感觉也不对。

最佳答案

您可以使用装饰器并添加返回额外列的方法:

class DogDecorator < Draper::Decorator
def extra_columns
[:barks, plays_catch]
end
end

class CatDecorator < Draper::Decorator
def extra_columns
[:meows]
end
end

...
<% animal.extra_columns.each do |column| %>
<td><%= animal.attributes[column.to_s] %>
<% end %>
...
<% @cats = CatDecorator.decorate_collection(Cat.all)
<%= render partial: "shared/animal", collection: @cats %>

关于ruby-on-rails - 从共享的局部 View 或替代解决方案中删除条件逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31443560/

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