Ruby on rails Rails 3视图重构:条件和查找

Ruby on rails Rails 3视图重构:条件和查找,ruby-on-rails,ruby-on-rails-3,refactoring,find,conditional,Ruby On Rails,Ruby On Rails 3,Refactoring,Find,Conditional,您认为重构这两位视图代码的最佳方法是什么 <%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? %> <

您认为重构这两位视图代码的最佳方法是什么

<%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%>

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

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

此外,您正在计算供应详细信息。按isbn id(@isbn)和
Productavailability查找所有。按代码(…)查找两次只需获得您的
  • 输出。也不要那样做

    您可能希望将大部分逻辑推送到控制器(或者根据使用位置和频率选择助手)中,以减少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
    
    然后在你的雇员再培训局:

    <% if @avail %>
        <li><%= @avail.value %></li> 
    <% end %>
    
    但我不会担心,直到你开始重复你自己


    我不熟悉formtastic,所以我不能帮你。

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

    此外,您正在计算供应详细信息。按isbn id(@isbn)
    Productavailability查找所有。按代码(…)查找两次只需获得您的
  • 输出。也不要那样做

    您可能希望将大部分逻辑推送到控制器(或者根据使用位置和频率选择助手)中,以减少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
    
    然后在你的雇员再培训局:

    <% if @avail %>
        <li><%= @avail.value %></li> 
    <% end %>
    
    但我不会担心,直到你开始重复你自己


    我不熟悉formtastic,因此我无法帮助您。

    了解代码的第一部分。请立即从视图中剪切此内容,并将其粘贴到控制器上,以获取代码的第一部分。请立即将其从视图中剪切并粘贴到控制器钻孔器ta上。有趣的是,您建议将代码放入控制器中——我担心通过创建另一个(胖控制器)来解决一个问题(拥挤的视图)。让重构开始吧@snowangel:控制器中的几行额外的代码并不是很“胖”,特别是当它只是通过为视图设置一些数据来完成它的工作时。如果你做了很多这方面的工作,那么你可以在你的模型中将其中的大部分推到一个方便的方法中,就像我更新我的答案一样。是的,我有很多——你的建议非常宝贵,谢谢。还有一个更好的可维护性原因,将东西放入控制器和模型是否会提高性能?@snowangel:将东西移出ERB可能会稍微提高速度,但除非你非常淘气,并且在模板中加载了大量代码,否则你可能不会注意到。我想你会首先注意到“不要为同一件事两次访问数据库”。[扭转手帕,以防我在不知情的情况下顽皮]呃,当你说“模板”时,你是指erb文件吗?太棒了,ta。有趣的是,您建议将代码放入控制器中——我担心通过创建另一个(胖控制器)来解决一个问题(拥挤的视图)。让重构开始吧@snowangel:控制器中的几行额外的代码并不是很“胖”,特别是当它只是通过为视图设置一些数据来完成它的工作时。如果你做了很多这方面的工作,那么你可以在你的模型中将其中的大部分推到一个方便的方法中,就像我更新我的答案一样。是的,我有很多——你的建议非常宝贵,谢谢。还有一个更好的可维护性原因,将东西放入控制器和模型是否会提高性能?@snowangel:将东西移出ERB可能会稍微提高速度,但除非你非常淘气,并且在模板中加载了大量代码,否则你可能不会注意到。我想你会首先注意到“不要为同一件事两次访问数据库”。[扭转手帕,以防我在不知情的情况下顽皮]呃,当你说“模板”时,你是指erb文件吗?