2017-01-30 2 views
2

у меня есть какая-то сложные PDF логики поколения, которая требует рендеринг вида вне контроллера, а затем проходящую в HTML в WickedPDF:Rails 5 визуализация набор переменного экземпляра в местных

ActionView::Base.send(:define_method, :protect_against_forgery?) { false } 
av = ActionView::Base.new 
av.view_paths = ActionController::Base.view_paths 

income_statement_html = av.render :template => "reports/income_statement.pdf.erb", :layout => 'layouts/report.html.erb', 
            locals: {:@revenue_accounts => revenue_accounts, 
              :@expense_accounts => expense_accounts, 
              :@start_date => start_date, 
              :@end_date => end_date, 
              :@business => business} 

Это все прекрасно работает на Rails 4, но перестала работать, когда мы обновили до Rails 5.

Все переменные экземпляра, которые мы устанавливаем здесь, находятся в виде nil внутри представления. Есть ли способ установить переменные экземпляра из вызова рендеринга, как это?

+0

': @ income_accounts' кажется довольно странным ... попробуйте просто:': income_accounts' (и в вашем шаблоне ссылайтесь на них как на локальные переменные, например 'account_accounts', а не на более глобальные' @ income_accounts') –

+0

@TarynEast не будет ли установка локальной переменной вместо переменной экземпляра внутри представления? – Deekor

+0

Да ... и это тоже должно работать. Идея заключается в том, что вы хотите, чтобы данные вошли в шаблон, чтобы он правильно отображался правильно? тот факт, что это переменная локального переменного vs, должна быть неактуальной для этой цели? –

ответ

-1

ActionView::Base имеет способ assign, который можно вызвать для установки переменных экземпляра.

av.assign({revenue_accounts: revenue_accounts, 
      expense_accounts: expense_accounts, 
      start_date: start_date, 
      end_date: end_date, 
      business: business}) 

income_statement_html = av.render :template => "reports/income_statement.pdf.erb", :layout => 'layouts/report.html.erb' 
3

Rails 5 введены ActionController::Base.render, который позволяет сделать это вместо:

rendered_html = ApplicationController.render(
    template: 'reports/income_statement', 
    layout: 'report', 
    assigns: { 
    revenue_accounts: revenue_accounts, 
    expense_accounts: expense_accounts, 
    start_date: start_date, 
    end_date: end_date, 
    business: business 
    } 
) 

Что вы можете перейти к WickedPDF:

WickedPdf.new.pdf_from_string(rendered_html) 

You can read more about .render and using it with WickedPDF, as well get some examples of how to extract this functionality into reusable objects on this blog post.

+0

@ Deekor Это ответ на ваш вопрос? – coreyward