1

我正在尝试使用档案宝石进行报告。
https://github.com/adamhunter/dossier

似乎在任何文档中都找不到如何通过 url 变量发送报告/test.csv?id=1

尝试了一些事情,要么得到错误,要么得到空白值。

4

2 回答 2

4

这个答案可能来得太晚了,但我想我会为未来的谷歌人分享。

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

希望这能回答你的问题!

于 2014-05-02T13:00:56.787 回答
2

您的 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
于 2014-08-07T19:37:26.467 回答