7

Я пытаюсь включить трубопроводную URL изображения активов в моей модели выхода сериализатора путем включения ActiveView :: Помощники:Asset Pipeline в активной модели сериализаторы

class PostSerializer < ActiveModel::Serializer 
    include ActiveView::Helpers 

    attributes :post_image 

    def post_image 
    image_path "posts/#{object.id}" 
    end 
end 

В результате /images/posts/{id}, а не действительный путь к путь к конвейеру, т.е. /assets/images/posts/{id}. Как включить правильные пути конвейера в мой вывод сериализатора?

+0

Возможный дубликат [Access Asset Path from Rails Controller] (http://stackoverflow.com/questions/7827078/access-asset-path-from-rails-controller) –

ответ

4

Может быть, это может работать:

def post_image 
    _helpers = ActionController::Base.helpers 
    _helpers.image_url "posts/#{object.id}" 
end 
1

Так я боролся с этим для немного сегодня. Я нашел немного менее идеальное решение. Решение ActionController::Base.helpers не работало для меня.

Это, безусловно, не самое оптимальное решение. Я считаю, что правильным решением может быть добавление инициализатора 'set_configs' в ActiveModelSerializer.

ActionView::Helpers::AssetUrlHelper использует функцию, называемую compute_asset_host, которая считывает config.asset_host. Это свойство будет установлено в инициализаторах railtie для ActionViews и ActionControllers. ActionController::RailTie

Итак, я закончил работу над классом ActiveModel :: Serializer и установил свойство config.asset_host в конструкторе, например.

class BaseSerializer < ActiveModel::Serializer 
    include ActiveSupport::Configurable 
    include AbstractController::AssetPaths 
    include ActionView::Helpers::AssetUrlHelper 

    def initialize(object, options={}) 
    config.asset_host = YourApp::Application.config.action_controller.asset_host 

    super 
    end 
end 

Это достало меня большую часть пути. Эти методы помощников также используют значение протокола; он может быть передан как параметр в хеш-опции, конфигурационную переменную или прочитан из переменной запроса. поэтому я добавил вспомогательный метод в своем BaseSerializer, чтобы передать правильные параметры.

def image_url(path) 
    path_to_asset(path, {:type=>:image, :protocol=>:https}) 
end 
3

(Очень) поздно к партии, но вы можете решить эту проблему, добавив в ваш ApplicationController:

serialization_scope :view_context 

, а затем в сериализаторе:

def post_image 
    scope.image_url('my-image.png') 
end 

Пояснения : Когда ваш контроллер инициализирует сериализатор, он передает объект scope (контекст) (по умолчанию контроллер его эльф, я думаю). Передача view_context позволяет использовать любой помощник, который вы сможете использовать в представлении.

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