获取 "undefined local variable or method error" 以仅在 heroku 服务器上而非本地生成 prawn pdf
getting a "undefined local variable or method error" for generating prawn pdf only on heroku server not locally
每当我在数据库中输入一条新记录时,在我重新启动我的 Heroku 服务器之前,大虾都无法识别它。我在本地(使用 Cloud9)没有问题,但是在使用 heroku 时出现如下错误:
NameError (undefined local variable or method `method_199'"
哪里没有找到method_199
,因为我刚把它添加到数据库中。如果我将我的代码重新部署到 heroku,那么它将识别 method_199
.
好像只有我的大虾pdf才有这个问题。在 heroku 网站上,数据库的其余部分似乎更新并响应得很好(这意味着我可以进行更新并且无需重新部署应用程序即可显示)
pdf.rb
class ReportTwoPdf < Prawn::Document
def initialize(property, current_user, start_date, end_date)
super(top_margin: 50)
@property = property
@current_user = current_user
@start_date = start_date
@end_date = end_date
# @activity_types.each do |type|
# eval("test_#{type.id}")
# end
current_user.activity_types.each do |type|
if @property.activities.where(activity_type_id: type.id).where(:date =>
(@start_date..@end_date)).count > 0
eval("method_#{type.id}")
else
end
end
end
ActivityType.all.each do |type|
define_method("method_#{type.id}") do
move_down 20
a = [1,
type.subject_toggle == "Show" ? 1 : nil,
type.contact_toggle == "Show" ? 1 : nil,
type.agent_toggle == "Show" ? 1 : nil,
type.customer_toggle == "Show" ? 1 : nil,
type.detail_toggle == "Show" ? 1 : nil,
type.outcome_toggle == "Show" ? 1 : nil,
type.cost_toggle == "Show" ? 1 : nil,
type.duration_toggle == "Show" ? 1 : nil].compact.length - 1
font "Nunito"
text type.title, :align => :left, size: 12, style: :bold
move_down 5
table eval("row_#{type.id}"), :position => :center, :width => 540,
:column_widths => {0 => 50,1 => @min_width, a => 60},
:cell_style => {:font => "Nunito", :size => 9} do
row(0).font_style = :bold
columns(0..8).align = :center
self.row_colors = ["F0F0F0", "FFFFFF"]
self.header = true
end
end
end
控制器:
def create_pdf
@property = Property.find(params.fetch("id_to_display"))
@current_user = current_user
@start_date = Date.strptime(params.fetch("start_date"), "%Y-%m-%d")
@end_date = Date.strptime(params.fetch("end_date"), "%Y-%m-%d")
@user = current_user
respond_to do |format|
format.html
format.pdf do
pdf = ReportTwoPdf.new(@property, @current_user, @start_date, @end_date)
send_data pdf.render, :filename => "Report: #{@property.address}.pdf", :type => "application/pdf", disposition: "inline"
end
end
end
宝石文件
gem "prawn"
gem 'prawn-table'
此行为是预期的,因为在生产中 类 仅在服务器启动时评估一次。这反过来通常只在部署或扩展时发生。 ActivityType
中的数据显然比部署
中的数据更频繁地更改
我不明白你为什么需要定义这些动态方法,你可以像处理任何其他数据一样处理 ActivityType
s:
class ReportTwoPdf < Prawn::Document
def initialize(property, current_user, start_date, end_date)
super(top_margin: 50)
@property = property
@current_user = current_user
@start_date = start_date
@end_date = end_date
current_user.activity_types.each do |type|
if @property.activities.where(activity_type_id: type.id).where(date: (@start_date..@end_date)).count > 0
handle_activity_type(type)
else
end
end
end
def some_row_similar(type)
# here goes the code
end
def handle_activity_type(type)
move_down 20
a = [
type.subject_toggle,
type.contact_toggle,
type.agent_toggle,
type.customer_toggle,
type.detail_toggle,
type.outcome_toggle,
type.cost_toggle,
type.duration_toggle
].count{|toggle| toggle == "Show" }
font "Nunito"
text type.title, align: :left, size: 12, style: :bold
move_down 5
table some_row_similar(type), position: :center, width: 540,
column_widths: {0 => 50, 1 => @min_width, a => 60},
cell_style: {font: "Nunito", size: 9} do
row(0).font_style = :bold
columns(0..8).align = :center
self.row_colors = ["F0F0F0", "FFFFFF"]
self.header = true
end
end
end
每当我在数据库中输入一条新记录时,在我重新启动我的 Heroku 服务器之前,大虾都无法识别它。我在本地(使用 Cloud9)没有问题,但是在使用 heroku 时出现如下错误:
NameError (undefined local variable or method `method_199'"
哪里没有找到method_199
,因为我刚把它添加到数据库中。如果我将我的代码重新部署到 heroku,那么它将识别 method_199
.
好像只有我的大虾pdf才有这个问题。在 heroku 网站上,数据库的其余部分似乎更新并响应得很好(这意味着我可以进行更新并且无需重新部署应用程序即可显示)
pdf.rb
class ReportTwoPdf < Prawn::Document
def initialize(property, current_user, start_date, end_date)
super(top_margin: 50)
@property = property
@current_user = current_user
@start_date = start_date
@end_date = end_date
# @activity_types.each do |type|
# eval("test_#{type.id}")
# end
current_user.activity_types.each do |type|
if @property.activities.where(activity_type_id: type.id).where(:date =>
(@start_date..@end_date)).count > 0
eval("method_#{type.id}")
else
end
end
end
ActivityType.all.each do |type|
define_method("method_#{type.id}") do
move_down 20
a = [1,
type.subject_toggle == "Show" ? 1 : nil,
type.contact_toggle == "Show" ? 1 : nil,
type.agent_toggle == "Show" ? 1 : nil,
type.customer_toggle == "Show" ? 1 : nil,
type.detail_toggle == "Show" ? 1 : nil,
type.outcome_toggle == "Show" ? 1 : nil,
type.cost_toggle == "Show" ? 1 : nil,
type.duration_toggle == "Show" ? 1 : nil].compact.length - 1
font "Nunito"
text type.title, :align => :left, size: 12, style: :bold
move_down 5
table eval("row_#{type.id}"), :position => :center, :width => 540,
:column_widths => {0 => 50,1 => @min_width, a => 60},
:cell_style => {:font => "Nunito", :size => 9} do
row(0).font_style = :bold
columns(0..8).align = :center
self.row_colors = ["F0F0F0", "FFFFFF"]
self.header = true
end
end
end
控制器:
def create_pdf
@property = Property.find(params.fetch("id_to_display"))
@current_user = current_user
@start_date = Date.strptime(params.fetch("start_date"), "%Y-%m-%d")
@end_date = Date.strptime(params.fetch("end_date"), "%Y-%m-%d")
@user = current_user
respond_to do |format|
format.html
format.pdf do
pdf = ReportTwoPdf.new(@property, @current_user, @start_date, @end_date)
send_data pdf.render, :filename => "Report: #{@property.address}.pdf", :type => "application/pdf", disposition: "inline"
end
end
end
宝石文件
gem "prawn"
gem 'prawn-table'
此行为是预期的,因为在生产中 类 仅在服务器启动时评估一次。这反过来通常只在部署或扩展时发生。 ActivityType
中的数据显然比部署
我不明白你为什么需要定义这些动态方法,你可以像处理任何其他数据一样处理 ActivityType
s:
class ReportTwoPdf < Prawn::Document
def initialize(property, current_user, start_date, end_date)
super(top_margin: 50)
@property = property
@current_user = current_user
@start_date = start_date
@end_date = end_date
current_user.activity_types.each do |type|
if @property.activities.where(activity_type_id: type.id).where(date: (@start_date..@end_date)).count > 0
handle_activity_type(type)
else
end
end
end
def some_row_similar(type)
# here goes the code
end
def handle_activity_type(type)
move_down 20
a = [
type.subject_toggle,
type.contact_toggle,
type.agent_toggle,
type.customer_toggle,
type.detail_toggle,
type.outcome_toggle,
type.cost_toggle,
type.duration_toggle
].count{|toggle| toggle == "Show" }
font "Nunito"
text type.title, align: :left, size: 12, style: :bold
move_down 5
table some_row_similar(type), position: :center, width: 540,
column_widths: {0 => 50, 1 => @min_width, a => 60},
cell_style: {font: "Nunito", size: 9} do
row(0).font_style = :bold
columns(0..8).align = :center
self.row_colors = ["F0F0F0", "FFFFFF"]
self.header = true
end
end
end