Rails引擎:在引擎下访问图像

时间:2014-04-02 03:00:19

标签: ruby-on-rails rails-engines

我们在一个应该显示图像的引擎下有一个视图。此图像(Button-Blank-Red-icon.png)保存在" app / assets / images / engine_name / Button-Blank-Red-icon.png

的引擎路径下

尝试显示此视图时出现以下错误。

ActionController :: RoutingError(没有路由匹配[GET]" / images /<> engine_name> /Button-Blank-Red-icon.png"):

显示在引擎的app / assets / images / engine_name /下存储的图片的正确方法是什么?

以下是视图代码:

<img src="<%= RED_GREEN_YELLOW_CLS[r.step_qties.last.ontime_indicator] %>"  height="15" width="15" />

r.step_qties.last.ontime_indicator会返回绿色&#39;红色&#39;之一。和&#39;黄色&#39;

常量RED_GREEN_YELLOW_CLS的定义位于引擎的config / initializers /下的my_constant.rb中:

RED_GREEN_YELLOW_CLS = {
                         'green'  => '/Button-Blank-Green-icon.png',
                         'red'    => '/Button-Blank-Red-icon.png',
                         'yellow' => '/Button-Blank-Yellow-icon.png'
                        }

一个带图像标记的工作解决方案(参见railscasts.com中的第277集):

<%=image_tag(RED_GREEN_YELLOW_CLS[r.step_qties.last.ontime_indicator], size: '23x23') %>

不需要阻止。

my_constant.rb是:

RED_GREEN_YELLOW_CLS = {
                         'green'  => 'engine_name/Button-Blank-Green-icon.png',
                         'red'    => 'engine_name/Button-Blank-Red-icon.png',
                         'yellow' => 'engine_name/Button-Blank-Yellow-icon.png'
                        }

4 个答案:

答案 0 :(得分:1)

您似乎正在通过AssetUrlHelpers显示图片。您的视图代码需要更改为以下内容:

<img src="<%= image_path(RED_GREEN_YELLOW_CLS[r.step_qties.last.ontime_indicator]) %>" 
  height="15" width="15" />

image_path将正确添加路径的assets部分以及资产管道生成的哈希值,以便您获得正确的网址。

答案 1 :(得分:1)

正确的网址应为&#34; / assets /&lt;&gt; engine_name&gt; /Button-Blank-Red-icon.png"因为当rails编译资产时,它只会将/ images / stylesheets和/ javascript的所有内容混合在一起,用于公共/资产中的所有宝石和app / assets目录。它只会复制&#34;&lt;&gt; engine_name&gt;&#34;文件夹及其内容。

目前尚不清楚:&#34; / images /&lt;&gt; engine_name&gt; /Button-Blank-Red-icon.png"来自,我不知道如何从你展示的代码中获得它。

尝试将您使用的内容更改为&#34; / assets /&lt;&gt; engine_name&gt; /..."它应该工作。

您可以尝试手动编译资产并查看文件的位置,只需执行&#34;捆绑执行rake资产:编译RAILS_ENV =生产&#34;,您可以安全地删除/公共/资产后保留它很干净。

答案 2 :(得分:1)

你试过asset_path帮助吗?

<%= image_tag(asset_path("engine_name/#{RED_GREEN_YELLOW_CLS[r.step_qties.last.ontime_indicator]}"), size: '23x23') %>

将engine_name替换为引擎应用程序的实际名称。

答案 3 :(得分:1)

来自引擎的图片可通过以下方式访问:

http://localhost:3000/assets/engine_name/image.png

就像你说的那样

<img src="<%= asset_path(RED_GREEN_YELLOW_CLS[r.step_qties.last.ontime_indicator]) %>"  height="15" width="15" />

RED_GREEN_YELLOW_CLS = {
                         'green'  => 'engine_name/Button-Blank-Green-icon.png',
                         'red'    => 'engine_name/Button-Blank-Red-icon.png',
                         'yellow' => 'engine_name/Button-Blank-Yellow-icon.png'
                        }

会工作。

P.S。我发现r.step_qties.last.ontime_indicator个人侮辱火车残骸。 :)