【问题标题】:Rails 3 views refactoring: conditionals and findsRails 3 视图重构:条件和查找
【发布时间】:2011-07-10 06:36:42
【问题描述】:

你会推荐什么作为重构这两个视图代码的最佳方法?

<%if Supplydetail.find_all_by_isbn_id(@isbn).first.nil? %>
<%else%>
<%if Productavailability.find_by_code(Supplydetail.find_all_by_isbn_id(@isbn).first.productsupply_supplydetail_productavailability).nil? %>
<%else%>
<li><%= Productavailability.find_by_code(Supplydetail.find_all_by_isbn_id(@isbn).first.productsupply_supplydetail_productavailability).value %></li>
<%end%>
<%end%>

和(使用格式)

%li.tip 
  = tooltip(:test, :hover)
= f.input :relatedmaterial_relatedproduct_idvalue, :label => "Related ISBN", :as => :select, :collection => Isbn.all, :label_method => :descriptivedetail_titledetail_titleelement_titlewithoutprefix, :value_method => :productidentifier_idvalue  
%li.list
  = link_to "Edit list", isbns_path 

我在我的应用程序中有无数次的这些示例,并且想知道在我投入到这项相当庞大的工作之前,我正在以最好的方式进行重构。

【问题讨论】:

  • 代码的第一部分。请立即将其从视图中剪切并粘贴到控制器

标签: ruby-on-rails ruby-on-rails-3 refactoring find conditional


【解决方案1】:

首先,if/else 中的空 if 分支通常(但并非总是如此!)闻起来很糟糕,所以不要这样做,它只会让你的代码更难阅读和理解。

另外,您计算 Supplydetail.find_all_by_isbn_id(@isbn)Productavailability.find_by_code(...) 两次只是为了得到您的 &lt;li&gt; 输出。也不要那样做。

您可能希望将大部分逻辑推送到您的控制器中(或者可能是一个助手,具体取决于它的使用位置和频率)以减少 ERB 噪声。

也许这样的事情会更好地为您(以及维护您的代码的人)服务;首先是一些控制器的东西:

@avail  = nil
by_isbn = Supplydetail.find_all_by_isbn_id(@isbn).first
if by_isbn
    @avail = Productavailability.find_by_code(by_isbn.productsupply_supplydetail_productavailability)
end

然后在你的 ERB 中:

<% if @avail %>
    <li><%= @avail.value %></li> 
<% end %>

如果您正在做很多此类事情,那么您可以在模型中添加一个Productavailability.for_isbn 便利类方法。那么你的控制器只需要:

@avail = Productavailability.for_isbn(@isbn)

但除非你开始重复自己,否则我不会担心。

我不熟悉formtastic,所以我无法帮助您。

【讨论】:

  • 太棒了,ta。有趣的是,您建议将代码放入控制器中 - 我担心通过创建另一个(胖控制器)来解决一个问题(一个拥挤的视图)。让重构开始吧!
  • @snowangel:控制器中的一些额外行并不完全是“胖”,尤其是当它只是通过为视图设置一些数据来完成其工作时。如果您做了很多这样的事情,那么您可以将其中的大部分内容推送到模型中的便利方法中,就像我对答案的更新一样。
  • 是的,我有很多 - 您的建议非常宝贵,谢谢。除了更好的可维护性原因之外,将内容推入控制器和模型是否会提高性能?
  • @snowangel:从 ERB 中移出东西可能会稍微提高速度,但除非您非常顽皮并使用大量代码加载模板,否则您可能不会注意到。我想你会首先注意到“不要为同一件事两次访问数据库”。
  • [扭曲手帕,以防我在不知不觉中调皮了] erm,当你说“模板”时,你是指 erb 文件吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 2011-02-15
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多