我有一个类似于这个的小红宝石模块/类:
module MyModule
class MyClass
include ActionView::Helpers::TagHelper
include ActionView::Context
include ActionView::Helpers::AssetUrlHelper
def test
puts "asset_url: #{asset_url('poster.jpg')}"
puts "asset_path: #{asset_path('poster.jpg')}"
end
end
end
当我在控制器中创建类的新实例然后调用测试方法时,结果是:
asset_url: /poster.jpg
asset_path: /poster.jpg
这不是我想要/期望/希望的!
但如果我在视图中这样做:
= "asset_url: #{asset_url('poster.jpg')}"
= "asset_path: #{asset_path('poster.jpg')}"
结果是:
asset_url: http://localhost:3000/assets/poster.jpg
asset_path: /assets/poster.jpg
这正是我想要的!那么为什么它会在模块中产生不同的结果呢?我怎样才能在模块中获得正确的资产路径?谢谢。
答案 0 :(得分:1)
如果要使用控制器中视图和帮助器的方法,可以使用view_context
。
例如:
class MyController < ApplicationController
def index
logger.debug view_context.asset_url('poster.jpg')
logger.debug view_context.asset_path('poster.jpg')
end
end
view_context
只是对象(好的,这是Class :)的对象,然后你可以将它传递到你需要的任何地方(来自控制器)。
module MyModule
class MyClass
def initialize(view_context)
@view_context = view_context
end
def test
puts "asset_url: #{@view_context.asset_url('poster.jpg')}"
puts "asset_path: #{@view_context.asset_path('poster.jpg')}"
end
end
end
或者将方法委托给这个对象(Ruby特性):
module MyModule
class MyClass
delegate :asset_url, :asset_path, to: :@view_context
def initialize(view_context)
@view_context = view_context
end
def test
puts "asset_url: #{asset_url('poster.jpg')}"
puts "asset_path: #{asset_path('poster.jpg')}"
end
end
end