活动模型序列化程序中的资产管道

时间:2013-12-03 20:57:40

标签: ruby-on-rails ruby-on-rails-4 asset-pipeline active-model-serializers

我试图通过包含ActiveView :: Helpers在我的模型序列化器输出中包含一个图像资源管道URL:

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}。如何在序列化程序输出中包含有效的资产管道路径?

3 个答案:

答案 0 :(得分:5)

也许这可行:

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

答案 1 :(得分:3)

(非常)晚会,但你可以通过将此问题添加到ApplicationController来解决问题:

serialization_scope :view_context

然后在序列化器中:

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

说明:当您的控制器实例化一个序列化程序时,它会传递一个scope(上下文)对象(默认情况下,我认为是控制器本身)。传递view_context允许您使用在视图中可以使用的任何帮助程序。

答案 2 :(得分:1)

所以今天我一直在努力解决这个问题。我找到了一个不太理想的解决方案。 ActionController::Base.helpers解决方案对我不起作用。

这当然不是最佳解决方案。我的想法是,正确的解决方案可能是为ActiveModelSerializer添加一个'set_configs'初始化器。

ActionView::Helpers::AssetUrlHelper使用名为compute_asset_host的函数,该函数读取config.asset_host。此属性看起来在ActionViews和ActionControllers的railtie初始化程序中设置。 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

这让我一路走来。这些助手方法也使用协议值;它可以作为选项哈希,配置变量或从请求变量读取的param传入。所以我在BaseSerializer中添加了一个帮助方法来传递正确的选项。

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