Rails ActionView :: Helpers无法正确解析资产路径

时间:2014-11-26 22:09:51

标签: ruby-on-rails ruby ruby-on-rails-4 asset-pipeline

我有一个类似于这个的小红宝石模块/类:

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

这正是我想要的!那么为什么它会在模块中产生不同的结果呢?我怎样才能在模块中获得正确的资产路径?谢谢。

1 个答案:

答案 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