2016-02-27 6 views
0

Я создал код, который генерирует файл xls, затем передаю его Mailer, чтобы отправить его в виде вложения. Но я получаю те же ошибки снова и снова:рельсы - приложите файл xls к электронной почте

TypeError: no implicit conversion of Spreadsheet::Workbook into String 

Или

NoMethodError: undefined method `length' for #<Spreadsheet::Workbook:0x007fe937e4fe80> 

Мой код:

def xls_mailer (data) 
attachments['HelloWorld.xlsx'] = data 
mail(subject: "Hi", to: @gmail.email) 
end 

*** данных - это файл XLS, который я; m, переходя к этому методу.

Спасибо вам, ребята, вперед,

+0

, что драгоценный камень вы используете для создания 'xlsx'? – devanand

+0

@devanand Я использую: 'spreadsheet', '~> 1.1', '> = 1.1.1' и 'to_spreadsheet' –

+0

- это 'data' строка? возможно, нет. то вы получите ошибку 'length'. отлаживать данные данных. – devanand

ответ

0

Ладно ребята, я узнал ответ. код должен быть таким:

spreadsheet_file = StringIO.new 
data.write(spreadsheet_file) 
attachments['HelloWorld.xls'] = spreadsheet_file.read 
1

Action Mailer ожидает, что вы передать его File -как объект в качестве вложения, но вашего кода передавая ему данные электронной таблицы непосредственно. К счастью, Ruby имеет класс с именем StringIO, что мы можем использовать, чтобы преобразовать нашу таблицу в то, что действует как File:

def xls_mailer (spreadsheet) 
    spreadsheet_file = StringIO.new 
    spreadsheet.write(spreadsheet_file) 
    attachments['HelloWorld.xls'] = spreadsheet_file 
    mail(subject: "Hi", to: @gmail.email) 
end 
+0

Благодарим вас за код, я пробовал. Но, когда я получил почту и попытаюсь открыть файл xls, он написал: «Недопустимый формат файла или расширение файла. Убедитесь, что файл не был поврежден и расширение файла соответствует формату файла. " –

+0

Это, по-видимому, [общая проблема] (https://github.com/zdavatz/spreadsheet/issues?utf8=kg&q=is%3Aissue+corrupt) с драгоценным камнем электронной таблицы. Вы пытаетесь изменить электронную таблицу, которая была первоначально создана Excel на Mac? Видимо [это не поддерживается] (https://github.com/zdavatz/spreadsheet/issues/162#issuecomment-169043728) –

+0

Исправить. Это именно то, что я делаю ... Единственный ответ для этого случая - загрузить файл на мой сервер, а затем использовать его путь к файлу вложения. True? –

0

Ниже фрагмент кода работает как шарм. Я пробовал это, использую в рабочем приложении.

def send_excel_report(file_name, emails, subject, email_content, file_path, bcc_emails = []) 

    attachments["#{file_name}.xls"] = File.read(file_path) 

    mail(to: emails, subject: subject, from: "[email protected]", bcc: bcc_emails) do |format| 
     format.html { render :partial => "users/mail_body"} 
    end 
    end 

FYI: Я использовал таблицы драгоценный камень, чтобы создать первенствовать