【问题标题】:Format datetime in model in rails在rails中的模型中格式化日期时间
【发布时间】:2015-02-20 10:51:22
【问题描述】:

我有一个将日期时间打印为 #{@event.starts_at.strftime("%m/%d/%Y %H:%M")} 的视图。所以每次打印starts_at时,我都必须在视图中使用strftime。我需要找到一种方法将方法添加到我的“事件”模型中,以便每次打印 event.starts_at 或 event.method_name(starts_at) 时自动格式化日期

【问题讨论】:

    标签: ruby-on-rails date methods model formatting


    【解决方案1】:

    你可以像下面这样覆盖getter:

    class Event < ActiveRecord::Base
      def starts_at
        attributes['starts_at'].strftime("%m/%d/%Y %H:%M")
      end
    end
    

    考虑到属性散列必须使用字符串而不是符号。

    也就是说,如果您的应用尝试国际化,这会锁定您,因为时间格式因地区而异

    您可以为此使用 rails I18n:

    de.yml

    de:
      time:
        formats: 
          default: '%A, %d. %B %Y, %H:%M Uhr'
          long: '%A, %d. %B %Y, %H:%M Uhr'
          short: '%d. %B, %H:%M Uhr'
          very_short: '%d.%m.%Y, %H:%M Uhr'
    

    你可以使用:

    > I18n.localize Event.first.starts_at, format: :very_short
    # => "26.11.2012, 10:35 Uhr"
    

    localize 方法的别名为 I18n.l

    它将使用正确的(如果已定义)

    【讨论】:

      【解决方案2】:

      您可以添加方法,但它会污染模型与视图相关的逻辑。最好的方法是为此目的创建装饰器,如果您不熟悉装饰器,则可以将其添加到模型中。

      def starts_at_format format = "%m/%d/%Y %H:%M"
         starts_at.strftime(format)
      end
      

      现在你可以使用starts_at_format,它会自动格式化日期

      format 具有默认值,因此如果以后需要使用其他格式,只需传递参数即可。

      你可以这样使用:

         starts_at_format
      

      或

         starts_at_format("%m %d %b") # define format
      

      【讨论】:

        【解决方案3】:

        感谢您的回答。我虽然通过将格式添加到初始化程序中找到了一个并解决了问题

        【讨论】:

          【解决方案4】:

          考虑使用带有draper 的装饰器。

          只需创建装饰器

          class EventDecorator < Draper::Decorator
            delegate_all
          
            def starts_at
              object.starts_at.strftime("%m/%d/%Y %H:%M")
            end
          end
          

          在控制器中做类似的事情

          @event = Event.find(params[:id]).decorate

          也可以用于多个对象

          @events = Event.all.decorate

          并且在视图中它会自动按照您的装饰方式提供服务;)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-03-15
            • 2014-02-28
            • 2018-06-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多