2014-12-22 4 views
2

У меня есть представление, которое печатает дату, когда # {@ event.starts_at.strftime ("% m /% d /% Y% H:% M")}. Поэтому каждый раз, когда я печатаю start_at, мне нужно использовать strftime в представлении. Мне нужно найти способ добавления метода к моей модели «событий», так что дата автоматически отформатируется каждый раз, когда я печатаю событие event.starts_at или event.method_name (start_at)Формат даты и времени в модели в рельсах

ответ

1

Вы можете добавить метод, но он будет загрязнять модель с логикой представления связаны между собой. Лучший способ - создать декоратор для этих целей, если вы новичок с декораторами, то вы можете добавить его в модель.

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

Вы можете переопределить геттер следующим образом:

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

Примите во внимание, что вы должны использовать строку, а не символ для хэша атрибутов.

это сказал, это блокирует вас, если ваше приложение пытается получить интернационализированы, поскольку форматы времени различны в зависимости от районов

Вы можете использовать рельсы 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

и он будет использовать правильный (если они определены)

0

Спасибо за ответы. Я нашел его, добавив формат к инициализаторам и выяснив проблему

0

Рассмотрите возможность использования декораторов с 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

и ввиду будет AUT omatically служил так, как вы его украсили;)

Смежные вопросы