如何在Rails应用程序中从Engine提供图像资源

时间:2014-04-06 21:39:58

标签: ruby-on-rails ruby-on-rails-3

我无法在我的引擎中获取图像资源以在主机应用程序内呈现。

由于view/layout/application.html.erb文件中的代码,我的主机应用程序能够从引擎抓取css和javascript:

 <%= stylesheet_link_tag    'my_engine/application', :media => 'all' %>
 <%= javascript_include_tag 'my_engine/application' %> 

但是,我不知道从我的引擎中包含图像的类似方法。关于如何在主机应用程序中呈现引擎的图像文件的任何想法?

编辑:

在我的引擎的engine.rb文件中,我已将images目录添加到应用程序的目录中,如下所示:

initializer :assets do |config|
  Rails.application.config.assets.paths << root.join("app", "assets", "images", "my_engine", "some_subdirectory")
end

并且视图的图像标记如下所示:

<%= image_tag "/my_engine/some_subdirectory/picture.png" %>

但是我的服务器记录了,我看到了:

Started GET "/assets/some_subdirectory/picture.png" for 127.0.0.1 at 2014-04-06 20:11:38 -0500
Served asset /some_subdirectory/picture.png - 404 Not Found (3ms)

ActionController::RoutingError (No route matches [GET] "/assets/some_subdirectory/picture.png"):

1 个答案:

答案 0 :(得分:3)

你根本不需要这样做,因为Rails为你做了

initializer :assets do |config|
  Rails.application.config.assets.paths << root.join("app", "assets", "images", "my_engine", "some_subdirectory")
end

相反,您可以像在应用程序中一样引用图像:

<%= image_tag "your_image.jpg" %>

我假设您的引擎中your_image.jpg位于/app/assets/images/your_image.jpg。如果它在子目录中,那么:

<%= image_tag "subdirectory/your_image.jpg" %>

除非文件位于app/assets/images/your_engine/your_image.jpg之类的某个位置,否则无需在路径中包含引擎名称,在这种情况下:

<%= image_tag "your_engine/your_image.jpg" %>

这是正确的方法。

The Engines Guide包含有关引擎的更多有用信息。