我在Rails 3应用程序中使用Paperclip和S3进行文件上传和存储。文件的上传工作正常,但是当尝试使用actionmailer将上传的文件附加到电子邮件时,我遇到了问题。经过大量的故障排除后,希望有人可以提供提示。
从较高的角度来看,似乎我可能需要先下载文件,然后再附加某种下载方法,这在此处建议,但我不太了解如何实现-paperclip + ActionMailer - Adding an attachment?
在应用程序中,用户上传文件(在本例中为测验)后,应通过电子邮件将用户上传的文件通知管理员。我一直遇到“没有这样的文件或目录”。下面是我现在正在使用的代码。任何想法或建议将不胜感激!
Quiz.rb model - what users are uploading:
class Quiz < ActiveRecord::Base
attr_accessible :quiz_path, :user_id, :tutorial_id
validates_presence_of :quiz_path
validates_attachment_size :quiz_path, :less_than => 50.kilobytes
validates_attachment_presence :quiz_path
validates_attachment_content_type :quiz_path,
:content_type => ["application/pdf","application/vnd.ms-excel",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
:message => 'We only accept Microsoft Excel files ending in .xlsx or .xls'
belongs_to :user
belongs_to :tutorial
has_attached_file :quiz_path,
:storage => :s3,
:s3_permissions => :private,
:path => "quizzes/:attachment/:style/:id.:extension",
:storage => :s3,
:s3_credentials => {
:access_key_id => ENV["AWS_ACCESS_KEY_ID"],
:bucket => ENV["S3_BUCKET_NAME"],
:secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"]
}
end
AdminMailer类:
class AdminMailer < ActionMailer::Base
default from: "info@mydomain.com"
def admin_upload_notification_email(quiz, current_user)
@url = "http://mydomain.com"
@quiz = quiz
@user = current_user
mail(to: "me@mydomain.com", :subject => "New Upload From #{@user.email}")
attachments["#{quiz.quiz_path_file_name}"] = File.read("{quiz.quiz_path.expiring_url(60)}")
end
end
还添加了QuizzesController:
def create
@user = current_user
@quiz = @user.quizzes.create(params[:quiz])
respond_to do |format|
if @quiz.save
UserMailer.upload_notification_email(@user).deliver
AdminMailer.admin_upload_notification_email(@quiz, @user).deliver
format.html { redirect_to @user, notice: 'Your skill assessment answer file was successfully uploaded. We will review your responses and email you a link to your results as soon as possible.' }
format.json { render json: @user, status: :created, location: @quiz }
elsif @quiz.errors.any?
flash[:error] = 'Please make sure you selected your answer file and it ended in ".xlsx".'
return(redirect_to :back)
else
format.html { redirect_to @user, notice: 'No file was selected. Please back and choose "Select Your Answer File" before submitting.' }
format.json { render json: @quiz.errors, status: :unprocessable_entity }
end
end
end
最佳答案
在弄乱了一些之后,能够使它工作。以下是对我有用的东西-希望它可以对某人有所帮助。关键是使用开放uri,因为测验文件位于S3上。
class AdminMailer < ActionMailer::Base
require 'open-uri'
default from: "sales@mydomain.com"
def admin_upload_notification_email(quiz, current_user)
@url = "http://mydomain.com"
@quiz = quiz
@user = current_user
attachments["#{quiz.quiz_path_file_name}"] = open("#{quiz.quiz_path.expiring_url(60)}").read
mail(to: "admin@mydomain.com", :subject => "New Upload From #{@user.email}")
end
end
关于ruby-on-rails - 无法通过Paperclip将存储在S3上的文件作为附件添加到ActionMailer中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15469796/