【问题标题】:Rails: Special classes based on params in viewsRails:基于视图中的参数的特殊类
【发布时间】:2013-04-25 16:46:19
【问题描述】:

根据每个单元格的不同标准,向 Rails 中的表格单元格添加类的最佳方法是什么?

例如...我有一个日期单元格:如果该日期在该日期后 10 天即将到来,则需要添加一个“即将到期”类。或者,如果日期已经过了今天,请添加“逾期”课程。

在另一个单元格上,基于一个字符串,它需要有一个“on”或“off”类。

我不知道该怎么做,但我知道我可能不应该在视图中包含一堆逻辑......

请指教。

【问题讨论】:

    标签: ruby-on-rails model-view-controller view logic controllers


    【解决方案1】:

    你可以用这样的方式来完成它:

    class="#{(@date - Time.now <= 10.days) ? upcoming_due : '' %>"

    但是,正如您所提到的,视图中包含大量逻辑并不好。如果您发现自己重复了相同的代码,您可以添加如下所示的辅助方法:

    def upcoming(date)
      (date - Time.now <= 10.days) ? 'upcoming_due' : ''
    end
    
    def past(date)
      (date - Time.now <= 10.days) ? 'past_due' : ''
    end
    

    在你看来,你会有这样的东西:

    class="#{ upcoming(@date).presence || past(@date).presence || '' }"

    【讨论】:

    • 所以我可以从控制器中引用视图中的这些操作?它必须是我的入口控制器吗? rails 怎么知道在哪里可以找到这些方法?
    • 您可以在视图中访问辅助方法。我认为 Rails 通过命名约定找到了这些方法。 app/views/user/* 将使用 app/helpers/user_helper.rb。如果它是您想要在多个视图中使用的实用程序,那么您可以将它放在app/helpers/application_helper.rb
    【解决方案2】:

    这听起来像是我在浏览器中使用 Knockout 所做的事情。基本上,您为数据库中的每个字段创建一个带有可观察字段的剔除模型,并使用计算字段来计算类名或基于这些字段的任何内容。然后,您使用 HTML 模板中的数据绑定属性绑定到敲除的计算字段。

    这种方法的缺点是用户需要启用 javascript 才能正确应用类,并且您在 javascript 中添加了一些逻辑。但我认为 javascript 文件是放置显示逻辑的好地方。

    【讨论】:

    • 那样的话,我为什么不直接使用jQuery呢?可能是最直接的方法,对吧?
    • 为此使用 javascript 无法通过气味测试。你最终会得到一个脆弱的 DOM 来显示静态内容。
    • @John,气味测试?脆弱的 DOM?
    • 如果它不是动态变化的,淘汰赛可能是矫枉过正,你可以只用 jquery 做到这一点。如果你想避免使用 javascript,我会选择演示者对象而不是帮助者。
    猜你喜欢
    • 1970-01-01
    • 2015-04-30
    • 2023-03-23
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    相关资源
    最近更新 更多