Rails сохраняет вложения, используя CloudMailIn и Paperclip для S3

Я приложение Rails, которое обрабатывает билеты клиентов (Worequests). У Билетов есть Комментарии туда и обратно между Клиентом и Сотрудником. Комментарий может иметь вложение. Он работает на Heroku, а PaperClip хранит вложения в S3.

Когда создается новый Комментарий и отправляется электронное письмо как Клиенту, так и Сотруднику, назначенному для Билета.

Я использую CloudMailIn, чтобы Заказчик или Сотрудник могли ответить на электронное письмо с комментарием новым комментарием.

Пока что работает отлично!

Но я хотел бы, чтобы ответное письмо содержало одно вложение.

Это работающий контроллер входящей почты:

class IncomingMailsController < ApplicationController
  skip_before_filter :verify_authenticity_token

  def create
    Rails.logger.info params
    worequest = params[:envelope][:to].split('@')[0]
    contents = params[:plain].split('---')[0]
    message = Comment.new(
        :worequest_id  => worequest,
        :user_id => User.find_by_email(params[:envelope][:from]).id,
        :comments => contents,
        :tenant_id => 1
    )
    if message.save
      render :text => 'Success', :status => 200
    else
      render :text => message.errors.full_messages, :status => 422, :content_type => Mime::TEXT.to_s
    end
end

Результаты журнала для Rails.logger.info params включает в себя это:

"envelope"=>{"to"=>"60@mail.myapp.com", "recipients"=>{"0"=>"60@mail.myapp.com"}, "from"=>"someguy@gmail.com", "helo_domain"=>"mail-wi0-f175.google.com", "remote_ip"=>"xxx.xx.xxx.xxx", "spf"=>{"result"=>"temp_error", "domain"=>"mydomain.com"}}, 

"attachments"=>{"0"=>#<ActionDispatch::Http::UploadedFile:0x00000007194040 @original_filename="five guys.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"attachments[0]\"; filename=\"five guys.jpeg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<File:/tmp/RackMultipart20140115-5-1n2rb24>>}, "action"=>"create", "controller"=>"incoming_mails"} 

attachments - это хеш, а "0" - это имя ключа. params[:attachments][‘0’]

Я могу получить доступ к этим полям в порядке:

Rails.logger.info params[:envelope][:from]
Rails.logger.info params[:envelope][:to]
Rails.logger.info params[:attachments]['0'].original_filename
Rails.logger.info params[:attachments]['0'].content_type

Но как мне установить скрепку :attach файл?

:attach => params[:attachments]['0'].tempfile  ?
:attach => params[:attachments]['0'].read  ?

Это моя текущая попытка:

attach = Attachment.new(
    :comment_id  => 346,
    :name => "Email Attachment",
    :attach_file_name => params[:attachments]['0'].original_filename,
    :attach_content_type =>  params[:attachments]['0'].content_type,
    :attach => params[:attachments]['0'].path,
    :tenant_id => 1
)

:attach => params[:attachments]['0'].path, неправильно.

Получение этого:

  Paperclip::AdapterRegistry::NoHandlerError (No handler found for "/tmp/RackMultipart20140115-13-tcpvtw"): 

Я не знаю, что использовать?????

:attach => params[:attachments]['0'].read,
:attach => params[:attachments]['0'].path.to_file,
:attach => params[:attachments]['0'].path.read,

Спасибо за помощь!

1 ответ

Решение

Это сработало:

        :attach => params[:attachments]['0'],
Другие вопросы по тегам