Ruby on rails 无法在视图中渲染图像(回形针/AWS)

Ruby on rails 无法在视图中渲染图像(回形针/AWS),ruby-on-rails,amazon-web-services,amazon-s3,paperclip,Ruby On Rails,Amazon Web Services,Amazon S3,Paperclip,在过去一天半的时间里,我一直在浏览SO的帖子,并提出了与此相关的另一个问题,但尚未找到解决方案。我无法渲染正在使用文档中指定的在我的视图中正确上载到AWS的图像 在我的数据库中,所有与头像相关的字段实际上都填充有: avatar_file_name => meditation.jpg avatar_content_type => image/jpeg avatar_file_size => 109992 avatar_up

在过去一天半的时间里,我一直在浏览SO的帖子,并提出了与此相关的另一个问题,但尚未找到解决方案。我无法渲染正在使用文档中指定的
在我的视图中正确上载到AWS的图像

在我的数据库中,所有与头像相关的字段实际上都填充有:

avatar_file_name  => meditation.jpg       
avatar_content_type => image/jpeg                   
avatar_file_size => 109992 
avatar_updated_at => 2016-08-04 06:48:31.361434
双击“我的亚马逊”存储桶中的图像链接,即可在浏览器中查看图像:

正如您所看到的,出于某种原因,添加了一个双文件扩展名,这是一个单独的问题(我欢迎反馈),但这似乎不是问题所在,因为我也无法在视图中使用单个文件扩展名渲染上载的图像

因此,随着图像被上传,数据库字段被填充,没有错误-我不知道为什么我不能在视图中渲染它们。我怀疑问题出在1)路径上——在我的模型中是这样的:

has_attached_file :avatar, 
:styles => { medium: "300x300#", thumb: "100x100#" },
:convert_options => {
:thumb => "-quality 75 -strip" }, 
:s3_host_name => "s3.amazonaws.com",
:path  => ":rails_root/public/:attachment/:id/:style/:filename.:extension",
:url => ":attachment/:id/:style/:filename.:extension",
:default_url => "default_img.png",
:storage => :s3,
:s3_credentials => {
  :bucket => 'giving-tree-images',
  :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
  :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
},
 :s3_permissions => {
  :original => 'public-read'
} 
validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/

attr_accessor :avatar_file_name, :avatar_content_type, :avatar_file_size, :avatar_updated_at
正如您所看到的,这似乎是正确的(除非我应该在我的模型中去掉
:rails\u root
位?)

或者2)我需要以某种方式将图像的位置保存在一个单独的模型中(我见过其他ppl这样做,但我不确定是否需要,因为其他人似乎没有这样做-尽管他们可能没有提到他们这样做了)。然而,我读过的任何文档中都没有这一步骤

3) 我还想知道在开发过程中是否有一个单独的过程需要我去做,而不是生产过程

或者4)我正在使用rails 4.2.3,并且在评论中读到回形针不支持aws>2.00的版本-但是-指示使用2.3…所以这可能是问题所在

gem "paperclip", "~> 5.0.0"
gem 'aws-sdk', '~> 2.3'
在以下其他文章中,我还设置了一个config/asw.yml文件,如下所示:

development:
  access_key_id:  <%= ENV['AWS_ACCESS_KEY_ID'] %>
  secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>

production:
  access_key_id:  <%= ENV['AWS_ACCESS_KEY_ID'] %>
  secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
并修改了myenvironments/development.rb和myenvironments/production.rb以包括:

  config.paperclip_defaults = {
  storage: :s3,
  :s3_host_name => "s3.amazonaws.com",
  s3_credentials: {
    bucket: ENV.fetch('S3_BUCKET_NAME'),
    access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'),
    secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'),
    s3_region: ENV.fetch('AWS_REGION'),
  }
}

…根据多个其他职位的合并建议。这很可能我不需要所有这些,所以如果有人能帮助我,我应该摆脱什么,为什么我不能在视图中渲染图像-我真的很感激,因为这是发疯

您正在将
扩展名
放在
:filename
之后,用于
:path
:url
——但您不应该这样做

:文件名
包括扩展名。这就是为什么你要得到两次分机

您的模型中包含以下内容:

:path=>“:rails\u root/public/:attachment/:id/:style/:filename.:extension”,
:url=>“:attachment/:id/:style/:filename.:extension”,

在删除
:扩展名
后,您应该具有以下功能:

:path=>“:rails\u root/public/:attachment/:id/:style/:filename”,
:url=>“:attachment/:id/:style/:filename”,

您是否尝试过不必定义:path和:url,而只使用默认路径?看看这对你是否有效?谢谢你的回复!我试着只使用
:url
,然后只使用
:path
,然后忽略这两个选项,运气不好
if Rails.env == "production"
 # set credentials from ENV hash
 S3_CREDENTIALS = { :access_key_id => ENV['AWS_ACCESS_KEY_ID'], :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'], :bucket => "giving-tree-images"}
else
 # get credentials from YML file
 S3_CREDENTIALS = Rails.root.join("config/s3.yml")
end
  config.paperclip_defaults = {
  storage: :s3,
  :s3_host_name => "s3.amazonaws.com",
  s3_credentials: {
    bucket: ENV.fetch('S3_BUCKET_NAME'),
    access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'),
    secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'),
    s3_region: ENV.fetch('AWS_REGION'),
  }
}