Rails:上传后访问图像文件

时间:2016-12-30 10:56:36

标签: ruby-on-rails image upload asset-pipeline

我正在编写Ruby on Rails 5应用程序。我刚刚学会了如何在不使用paperclip,carrierwave或refile的情况下上传图像。我过去曾使用过refile,但是对于这个应用程序,我想学习如何使用这些第三方宝石。这并不难。我已成功上传了一个文件。我的问题是之后访问图像!我觉得这很简单。但不是!

我将图像文件上传到“/public/images/page/image.jpg”

我已将“/ public / images / page”添加到app / initializers / assets.rb中的资源路径

我试过这样的直接img标签:

<img class="pic left" src="/public/images/page/mars01.jpg" alt="Mars01" />

我得到一个“(没有路由匹配[GET]”/public/images/page/mars01.jpg“)”错误。 我试过了:

<%= image_tag "/public/images/page/#{@page.image}", class: 'pic left' %>

与tag完全相同,得到相同的结果。还尝试过:

<img class="pic left" src='<%= image_path "#{@page.image}" %>' />

仍然出现路由错误,但只查看“/ images”目录。我仍然处于开发模式,所以我认为image_path将是正确的路径。

访问图像的正确方法是什么,只是上传到资产管道之外的目录?那将在开发或生产环境中起作用吗?我真的认为这是直截了当的。

2 个答案:

答案 0 :(得分:0)

您不必在image_tag内提供图像的完整路径,只需将图像名称与子目录一起提供即可。

请尝试<%= image_tag "#{@page.image}", class: 'pic left' %>

请阅读有关资产管道的更多信息。 http://guides.rubyonrails.org/asset_pipeline.html

答案 1 :(得分:0)

以下是我最终为感兴趣的人做的事情。

在我的控制器中我这样做了:

# default to development go to app/assets/images
path = Rails.root.join('app', 'assets', 'images', uploaded_io.original_filename)
if ENV['RAILS_ENV'] == 'production'
  # change only if in production to public/assets/images
  Rails.root.join('public', 'assets', 'images', uploaded_io.original_filename)
end
File.open(path, 'wb') do |file|
  file.write(uploaded_io.read)
end

基于RAILS_ENV;如果开发,图像将转到app / assests / images文件夹;如果在生产中他们去公共/资产/图像。

使用直接的image_tag:

<%= image_tag "#{@page.image}" %>

像魅力一样工作。至少我知道它适用于开发环境。 感谢那些回应的人。 (Mat和长崎)