Rails,从视图中拉出复杂的逻辑

我有一个变得越来越复杂的观点,我想知道我应该这样做吗? 图片(或代码)值1000字,所以inheritance人的观点……

   
  • (/)
  • (Class full)
  • (/)
  • (Class Closed)
  • (Class full)
  • 您正在查看的是计划应用程序的前端日历视图。 根据不同的状态,您可以在日历上看到每天不同的信息,即剩余的座位数,而“完全等级”与管理员的其他信息相比。 我应该以某种方式将这个逻辑拉入我的模型或控制器吗?

    有很多方法可以给猫皮肤。 哪个’正确’与个人偏好一样多。 也就是说,这里有一些您可能想要考虑的想法。

    对每种类型的用户使用partials这可能是您的驾驶问题,也可能不是,但决策的最外层是基于用户类型,因此为每种类型的用户构建一个部分是有意义的。 在这种情况下,您可能有’active_user_orientation_view’和’guest_orientation_view’。 这样做可以将您的视图(此部分)缩减为单个if-then-else语句,并清楚地表明您的意图 – 注册用户会看到一件事,而客人会看到其他内容。

    将重复代码包装到辅助方法中使用完全相同的代码生成两个列表项。 让它干! 作为一个例子,我可能会进入OrientationsHelper(app / helpers / orientations_helper.rb)并添加一个#orientation_full_item帮助器,就像这样

     def orientation_full_item(orientation) content_tag(:li) do "#{orientation.class_time} (Class full)" end end 

    有了这个帮助器,呈现“类已满”消息的两行可以减少到<%= orientation_full_item(orientation)%>。 您可以对提供注册表单链接的列表项执行相同操作。 为了保持一致性,您可以对所有列表项执行此操作。 这会给你一个非常清楚地表明其意图的观点。

    考虑使用Presenter而不是使用面向视图的便捷方法丢弃模型(业务逻辑),更好的选择是创建一个接受类实例并提供相同方便方法的新类。 这就是Presenter模式的全部内容。 它的优点是你可以非常清楚地按照它的意图组织你的代码 – 商业逻辑保持在一起并保持与视图逻辑的联系。 在这种情况下,您可以提供ActiveUserOrientationPresenter和GuestOrientationPresenter类,每个类都提供一个#list_item便捷方法,能够使用适当的内容呈现列表项。

    PragProg的人有一个由布鲁斯威廉姆斯写的标题,其中有一些关于如何构建强大的视图代码的一些很好的建议,这些代码可能值得投入资金和时间。 其中一个可用的代码段专门处理演示者。 你可以阅读http://media.pragprog.com/titles/warv/present.pdf 。

    编写unit testing,用XPath确定所有

  • 项目的内容。

    Grab Nokogiri ,并使用Nokogiri::HTML::Builder在Ruby中编写所有内容:

     builder = Nokogiri::HTML::Builder.new do |doc| doc.ul { doc.li('data 1') doc.li('data 2') if oodles_of_poodles? doc.li('data 3') } end puts builder.to_html 

    现在它全部采用一种语言,您可以自由地重构它,而不必经常绊倒将两种语言混合在一起所需的转义令牌。