我正在尝试使用档案宝石进行报告。
https://github.com/adamhunter/dossier
似乎在任何文档中都找不到如何通过 url 变量发送报告/test.csv?id=1
尝试了一些事情,要么得到错误,要么得到空白值。
我正在尝试使用档案宝石进行报告。
https://github.com/adamhunter/dossier
似乎在任何文档中都找不到如何通过 url 变量发送报告/test.csv?id=1
尝试了一些事情,要么得到错误,要么得到空白值。
这个答案可能来得太晚了,但我想我会为未来的谷歌人分享。
tl;博士
/report/test?options[p1]=v1&options[p2]=v2
将在TestReport
实例内部可用,options[:p1] # => 'v1'
并且options[:p2] # => 'v2'
解释:
当访问诸如/reports/test.csv
您的 url 时将触发TestReport
被实例化并最终接收 CSV 输出。如果您想从 URL 传递动态选项,您可以将它们添加到:options
将由控制器传递给实例化报告的参数中。
也就是说,在 url 中使用的格式如下:/reports/test.csv?options[id]=1&options[so_fancy]=true
. 这将导致TestReport.new(id: '1', so_fancy: 'true')
在控制器中被调用。在报告实例内部,您将能够通过options
哈希访问这些选项。我个人通常为我的选项编写访问器,因为这允许我处理类型转换。所有选项都以字符串形式出现(因为所有控制器参数都以字符串形式出现)。
例如:
class TestReport < Dossier::Report
# NEVER interpolate options directly into your query
# This uses id_where which will trigger query binding via the :id reference
# your column names do not need to map to your options
def sql
"select * from foos where #{id_where} fancification = :fancy"
end
# conditionally adding this clause if id is present in options
def id_where
"id = :id or" if options[:id].present?
end
# makin' sure id is a number, probably superfluous, mainly for example
def id
options[:id].to_i
end
# the getter method names and the options keys do not need to correspond,
# don't forget all values come in a strings!
def fancy
options[:so_fancy] == 'true' ? true : false
end
end
希望这能回答你的问题!
您的 URL 需要类似于:
http://www.example.com/reports/test?options[id]=1
并且您将添加一个与您的选项同名的方法,在这种情况下id
添加到您的报告中以捕获该 URL 参数:
class TestReport < Dossier::Report
def sql
"SELECT * FROM foos WHERE id = :id"
end
def id
options[:id]
end
end