AWS凭证不适用于Rails 4和mongoid中的Paperclip图像上传

时间:2014-04-04 05:34:40

标签: ruby-on-rails-4 amazon-s3 mongoid paperclip strong-parameters

我收到以下错误:

The AWS Access Key Id you provided does not exist in our records.

我不确定为什么我会收到此错误,因为我在我的aws安全凭据页面中显示了正确的访问密钥和密钥(我已复制并粘贴多次以反驳可能性错字)。如果我能够登录并访问我的STILL空桶,为什么它会告诉我我的访问密钥不在他们的记录中?

这是我的s3.yml:

GMAIL_USERNAME: <my email>
GMAIL_PASSWORD: <my password>
MONGOHQ_URL: <my mongoid url>
S3_BUCKET_NAME_DEVELOPMENT: <my development bucket>
S3_BUCKET_NAME_PRODUCTION: <my production bucket>
S3_BUCKET_NAME_TEST: <my test bucket>
AWS_ACCESS_KEY_ID: <my access key>
AWS_SECRET_ACCESS_KEY: <my secret key>

这是我的照片.rb:

class Picture
  include Mongoid::Document
  include Mongoid::Paperclip

  embedded_in :datum, inverse_of: :pictures

  has_mongoid_attached_file :attachment,
                            path: ':attachment/:id/:style.:extension',
                            storage: :s3,
                            url: ':s3_domain_url',
                            bucket: Proc.new{ |a| a.instance.s3_bucket },
                            s3_credentials: File.join(Rails.root, 'config', 's3.yml'),
                            styles: {
                                original: ['1920x1680', :jpg],
                                small: ['100x100', :jpg],
                                medium: ['250x250', :jpg],
                                large: ['500x500', :jpg]
                            },
                            convert_options: { all: '-background white -flatten +matte' }

  def s3_bucket
    if Rails.env.development?
      ENV['S3_BUCKET_NAME_DEVELOPMENT']
    else
      ENV['S3_BUCKET_NAME_PRODUCTION']
    end
  end
end

这是我的datum.rb:

class Datum
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Paperclip

  field :title, type: String
  field :user_id, type: Integer

  validates :title, presence: true
  validates :user_id, presence: true

  embeds_many :todo_items
  embeds_many :pictures, cascade_callbacks: true
  accepts_nested_attributes_for :pictures
end

以下是我的datum_params方法:

# Never trust parameters from the scary internet, only allow the white list through.
def datum_params
  params.require(:datum).permit(:title, :user_id, :identifying_image, pictures_attributes: [:picture])
end

以下是我的picture_params方法:

def picture_params
  params.require(:picture).permit(:datum_id, :attachment)
end

以下是我用于上传的表单:

<%= bootstrap_form_for(picture, url: { action: :create }, html: { multipart: true }, remote: true ) do |f| %>
  <%= f.file_field :picture, multiple: true, name: 'picture[picture]' %>
  <%= f.submit 'Upload' %>
<% end %>

最初,我有一个strong_parameters问题,rails4guides.com(下面给出答案的用户)能够帮助我克服。当我停止获取未经许可的参数错误并开始从AWS获取错误时,我知道我取得了进展。任何人都可以看到我的凭据无法正常工作的原因吗?我应该在请求参数中看到有关我的访问密钥的任何内容吗?因为我现在不在。

1 个答案:

答案 0 :(得分:1)

好的,我将在另一个答案中进一步解释,以便进一步阐述。

在典型情况下,您的表单会有类似的内容:

<%= f.file_field :picture %>

图片是您要上传的文件的名称。现在想象一下这个表单会将结果传递给ImagesController。为了使ImagesController能够处理图片,它应该通过强参数列入白名单,如:

def image_params
  params.require(:image).require(:picture)
end

另一种情况是使用嵌套属性。如果您想为文章设置图片,您的表单将如下所示:

<% f.fields_for :image do |image_form| %>
  <%= image_form.file_field :picture %>
<% end %>

你的article_params看起来像这样:

def article_params
  params.require(:article).permit(:title, :content, images_attributes: [:picture])
end

小记:它应该是images_attributes(都是复数)而不是image_attributes。另一方面,实际的嵌套属性应该是单数。

这几乎是强参数使用的基本概要,我希望它能帮到你。附:可能会有一些错别字,因为我在手机上打字。