2015-04-29 2 views
1

Я пытаюсь включить метод из вспомогательного модуля в подкласс ActiveModel::Serializer, но по какой-то причине метод не появляется.Ruby: Как включить методы из модуля в подкласс ActiveModel :: Serializer

Вот мой простой помощник модуль:

module Helpers 
    module Serialisers 
    def enforce_zulu_time(attribute) 
     define_method(attribute) do 
     object.send(attribute).utc.iso8601 unless object.try(attribute).nil? 
     end 
    end 
    end 
end 

А вот мой тест serialiser

class TestSerialiser < ActiveModel::Serializer 
    include Helpers::Serialisers 
    attributes :updated_at 

    enforce_zulu_time :updated_at 
end 

и мой простой объект сериализация

class TestItem 
    include ActiveModel::SerializerSupport 
    attr_reader :updated_at 
    def initialize 
    @updated_at = Time.now.utc 
    end 
end 

и мой тест

describe Helpers::Serialisers do 
    let(:item)  { TestItem.new } 
    let(:serialiser) { TestSerialiser.new(item) } 
    subject   { serialiser.attributes } 

    it { expect(subject[:updated_at]).to be_zulu_time} 
end 

приводит

`<class:TestSerialiser>': undefined method `enforce_zulu_time' for TestSerialiser:Class (NoMethodError) 

Однако, если я просто сделать это в моем TestSerialiser вместо

class TestSerialiser < ActiveModel::Serializer 
    attributes :updated_at 

    ['updated_at'].each do |attribute| 
    define_method(attribute) do 
     object.send(attribute).utc.iso8601 unless object.send(attribute).blank? 
    end 
    end 
end 

все работает отлично.

Почему мой метод enforce_zulu_time не входит?

ответ

2

Замените include Helpers::Serialisers на extend Helpers::Serialisers, так как вы ожидаете методов класса.

Другим решением было бы использовать ActiveSupport::Concern, see doc


Sidenote

Для того, чтобы иметь свой код гибким бесплатно, я рекомендую вам создать свой собственный базовый класс для вашего сериализаторы, такие как:

class BaseSerializer < ActiveModel::Serializer 
end 

Затем все ваши сериализаторы наследуют от него. Таким образом, вы можете легко добавлять функции.

+0

Это похоже на работу. –

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