【问题标题】:Instance Variables not being passed into View实例变量未传递到视图
【发布时间】:2021-04-14 18:43:25
【问题描述】:

所以也许这是一个不好的问题,但我正在尝试创建一个 pdf 生成器,它通过 html 视图将数据库中的名称动态地放入 pdf 中。

这是我的控制器的下载功能。

class PdfGeneratorController < ApplicationController    
    def download    
        @actual_locale = I18n.locale
        I18n.locale = :en
        @user = User.find(params[:userid])
        @firstname = @user.first_name
        @lastname = @user.last_name
        
        html = PdfGeneratorController.new.render_to_string(
          {
            template: "/pdf_generator/download",
            layout: "user_courses/certificate_layout",
            
          }
        )
        pdf = Grover.new(html, wait_until: 'load').to_pdf
        send_data pdf, type: "application/pdf", disposition: 'attachment', filename: 'Certificate.pdf'
        I18n.locale = @actual_locale
    end
end

如果我在声明@user、@firstname 和@lastname 的位置之后放置一个byebug,它们都会返回正确的数据。在我名为 download.html.erb 的视图中,我像这样使用 @firstname 和 @lastname。

<h2 class="certificate--title"> Demo Certification</h2>
  <h4>is proudly presented to</h4>
  
  <h2 class="certificate--acquirer-name"><%= @firstname %> <%= @lastname%> </h2>

但是,当生成 pdf 时,其中没有名称。最后,我用 byebug 进行了测试,@firstname 和 @lastname 在视图中返回为 nil。有什么想法我可能做错了吗?

【问题讨论】:

  • “也许这是个坏问题” – 没有这样的事情 :-)
  • @Stefan:除了这个网站到处都是 :) 可能没有愚蠢的问题(有争议的),但有很多不好的问题:懒惰、难以理解、写得不好等。幸运的是我们,这个问题不是其中之一。

标签: ruby-on-rails ruby


【解决方案1】:

问题是您正在创建一个新的控制器实例,而您应该只使用当前实例。

html = PdfGeneratorController.new.render_to_string(

应该是:

html = render_to_string(

控制器实例的创建通常由 Rails 框架完成,不应由您自己完成。

【讨论】:

  • 使用这种方法,您可能也不必显式设置template
  • 解决了!谢谢!我没有意识到 PdfGeneratorController.new 初始化了一个全新的控制器,我以为我只是在控制器中调用新函数,很高兴知道!
  • 它并没有真正“重置”实例变量。实例变量是类实例的局部变量——因此期望一个完全独立的实例具有相同的实例变量是错误的。 “我以为我只是在控制器中调用新函数”我认为您可能会将其与实例方法 #new 混淆。 class method .new 创建一个类的新实例。
  • @justUrAverageProgrammer 如果意图在控制器中调用new 操作,请使用new(或self.new)而不是PdfGeneratorController.new。前者在控制器实例(又名控制器动作)上调用new,而后者创建一个新的控制器实例。通常,您不会从另一个控制器中调用一个控制器操作。如果是这种情况,您可能希望将共享逻辑移动到私有控制器方法(如果它涉及渲染逻辑)或相关模型(如果它不涉及渲染逻辑)。
猜你喜欢
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 2012-06-29
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
相关资源
最近更新 更多