2016-10-20 5 views
1

При отправке почты мне нужно преобразовать почту в PDF-документ.Сгенерировать PDF путем привязки шаблона erb, который содержит переменную экземпляра при отправке по электронной почте

Для того, чтобы сделать это, мне нужно, чтобы связать шаблон ERB с данными, но шаблон ERB содержит переменные экземпляра

пусть шаблон будет ..,

<h1>Name: <%[email protected]%><h1> 
<h2>Address: <%= @address %><h2> 

Я следовал за это решение упомянуть в question, используя пространство имен для привязки шаблонов к данным.

class Namespace 
    def initialize(hash) 
    hash.each do |key, value| 
     singleton_class.send(:define_method, key) { value } 
    end 
    end 

    def get_binding 
    binding 
    end 
end 

ns = Namespace.new(name: 'Joan', address: 'Chennai, India') 
ERB.new(template).result(ns.get_binding) 

Это прекрасно работает для шаблонов, которые не содержат переменных экземпляра.

Мне нужно передать данные в переменные экземпляра в шаблоне, есть ли возможность для этого.

И я знал способ решить эту проблему путем присвоения переменных экземпляра с данными, которые мы связываем т)

в шаблоне

<% @name = name %> 
    <% @address = address %> 
    <h1>Name: <%[email protected]%><h1> 
    <h2>Address: <%= @address %><h2> 

Но я не хотите такого рода реализации.

ответ

3

Надеюсь, вы создаете строку HTML для создания файлов PDF/вида. В этом случае нам нужно объявить переменную экземпляра, из которой вы вызываете эти вызовы. Чтобы он мог получить доступ через запрос. (Концепции одинакового почтового ящика)

Я попробовал нижний вариант для этих случаев. Оно работает.

def generate_attachment(your_variable) 
    @your_instance_variable = your_variable 

    attachments['attachment.pdf'] = WickedPdf.new.pdf_from_string(render_to_string(:pdf => "filename.pdf",:template => '/_template.html.erb')) 
    end 
2

Вы можете изменить свой метод Namespace#initialize так, что он присваивает переменный экземпляр вместо определения методов экземпляра для каждого ключа вашего хэша:

class Namespace 
    def initialize(hash) 
    hash.each do |key, value| 
     instance_variable_set(:"@#{key}", value) 
    end 
    end 

    def get_binding 
    binding 
    end 
end 

ns = Namespace.new(name: 'Joan', address: 'Chennai, India') 
#=> #<Namespace:0x007feca2400e98 @address="Chennai, India", @name="Joan"> 
ERB.new(template).result(ns.get_binding) 
#=> "<h1>Name: Joan<h1>\n<h2>Address: Chennai, India<h2>"