7

据说,ActionController::Base.helpers它就像一个代理,用于访问视图之外的助手。然而,那里定义的许多方法都依赖于控制器变量,我无法成功调用:

ActionController::Base.helpers.image_path("my_image.png")
>> TypeError Exception: can't convert nil into String

挖掘源代码我看到的方法是compute_asset_host试图访问config.asset_host但是.confignil

如何image_path从外部视图成功调用?

4

3 回答 3

12

用于view_context访问视图中可用的那些辅助方法。

您可以image_path从控制器这样调用。

view_context.image_path "my_image.png"
于 2012-07-17T16:40:35.703 回答
5

对于 Rails 3,请在此处查看更清洁的解决方案How can I use image_path inside Rails 3 Controller

于 2011-05-10T02:39:54.210 回答
0

这个由 Mason Jones 发布的解决方案对我有用。

在您的应用程序控制器中:

def self.tag_helper
  TagHelper.instance
end

class TagHelper
  include Singleton
  include ActionView::Helpers::TagHelper
  include ActionView::Helpers::AssetTagHelper
end

然后你可以做下面的事情,或者你需要的任何其他事情。

active_scaffold :mything do |config|
  config.columns = [:name, :number, :active, :description]
  config.update.link.label = tag_helper.image_tag('document_edit.png', :width => "30")
  config.delete.link.label = tag_helper.image_tag('document_delete.png', :width => "30")
  config.show.link.label = tag_helper.image_tag('document.png', :width => "30")
  list.sorting = {:name => 'ASC'}
end

您正在 ApplicationController 中创建 TagHelper 的 Singelton 实例。这可以在您需要的任何地方为您提供帮助。他在他的帖子中解释了这一点。

此外,我使用它来扩展我的模型(创建一个更灵活的 image_tag 助手,如果没有图像,则返回默认图像——例如,person.small_image 是使用 tag_helper 的人模型的实例变量)。为此,我将相同的代码放在扩展 ActiveRecord::Base 的 Monkey Patch 初始化程序中。然后我从我的模型中调用 ActiveRecord::Base.tag_helper。这有点混乱,但我是 Rails 新手。可能有更清洁的方法。

希望有帮助。

于 2011-03-11T01:02:36.463 回答