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