【问题标题】:Rails export array of hash to csvRails 将哈希数组导出到 csv
【发布时间】:2016-10-17 06:31:58
【问题描述】:

在我的show 路由中,有一个my_search 路由(基本上是show#my_search)以HTML 格式显示数据的哈希数组。

我需要做的只是将@data 转储到我的render(或部分)并在视图中处理它们,使其成为一个嵌入了 ruby​​ 的 HTML 表格。

但是,有没有一种简单的方法可以将相同的 @data 发送到 CSV 文件?我是否必须再次获得@data 并专门为它制作另一条路线?显示页面localhost://show/my_search时是否可以访问@data(最好是在下载其CSV或json渲染的链接中)?

编辑:

@data 看起来像:

@data = [ {"name"=>"John", "age"=>"21"}, {"name"=>"Amy", "age"=>"20"} ]

app/controllers/show_controller.rb 看起来像:

def my_search
    @data = [ {"name"=>"John", "age"=>"21"}, {"name"=>"Amy", "age"=>"20"} ] # and other rows
    # and do other stuff here

    render "table_template"

app/views/show/table_template.html 中看起来像:

<table>
  <thead>
  <tr>
    <th>Name</th>
    <th>Age</th>
  </tr>
  </thead>

  <tbody>
  <% @data.each do |row| %>
      <tr>
        <td><%= row['name'] %></td>
        <td><%= row['age'] %></td>
      </tr>
  <% end %>
  </tbody>
</table>

2016 年 6 月 20 日更新:我目前的解决方法:

app/controllers/show_controller.rb:

def my_search
     get_data
    # and do other stuff here

    render "table_template"
end

def my_search_export
    get_data 
    format.each do |format|
    # something that renders the CSV format when visiting localhost://my_search_export.csv
        .....
    end
end




private
def get_data # writes to @data
    @data=[ {"name"=>"John", "age"=>"21"}, {"name"=>"Amy", "age"=>"20"} ]
end

在视图中:添加一个 url 到 localhost://my_search_export.csv

不好的是它会再次加载数据,好的是工作流程很简单。我仍在寻找更好的解决方案。

附:这个网站可能有不同的用户同时运行,所以保留一个全局变量对我来说听起来不合适。

【问题讨论】:

  • 谢谢Seth,但是当显示localhost://show/my_search的网页时我如何输出CSV可下载链接
  • stackoverflow.com/questions/94502/… 可能会有所帮助——但这只会允许转到localhosts://some/path/file.csv,这意味着它在localhosts://some/path/file.csv 中没有显示网页

标签: ruby-on-rails ruby csv


【解决方案1】:

如果需要,您可以打开一个 CSV 并在 render 之前写入:

@data = { first_stuff: ['a', 'b', 'c'], second_stuff: [1, 2, 3] }
CSV.open('some/file.csv', 'w') do |csv|
  @data.each_pair do |key, value|
    csv << value
  end
end
render json: @data

...等等。如果不知道您的 @data 是什么样子,很难得到更具体的信息,但我希望这会有所帮助!

【讨论】:

  • 感谢您的帮助!我在问题中添加了更多描述。是不是如果这个函数有render json: @data那么它就不会渲染任何html页面?显示页面localhost://show/my_search时是否可以访问@data
  • 哦,您的意思是在渲染之前将 CSV 文件(并可能在视图中添加指向该 some/file.csv 路径的链接)到本地路径(可能在 public 文件夹中?)网页?
  • 哦,如果你正在渲染一个 HTML 页面,你的控制器方法的实例变量应该只是在视图中可用。换句话说,只要正常渲染页面,@data 应该可以在模板中使用。至于您的第二条评论,您可以将 CSV 的文件路径设置为实例变量(即@csv_path = 'some/file.csv'),然后它也可以在您的视图中用于链接目的。
  • 谢谢!所以我只需将 CSV 写入 'some/file.csv' 的本地副本,然后将其链接到用户?这将是一个很好的解决方法,但我想知道它是否可以提供一次性下载链接并且不会在网站中存储太多东西.. @jmschles
【解决方案2】:

2016 年 6 月 20 日更新:我目前的解决方法:

app/controllers/show_controller.rb:

定义我的搜索 获取数据 # 并在这里做其他事情

render "table_template"

结束

def my_search_export 获取数据 format.each 做 |format| # 在访问 localhost://my_search_export.csv 时呈现 CSV 格式的东西 ...... 结尾 结束

私人的 def get_data # 写入@data @data=[ {"name"=>"John", "age"=>"21"}, {"name"=>"Amy", "age"=>"20"} ] 结尾 在视图中:添加一个 url 到 localhost://my_search_export.csv。

不好的是它会再次加载数据,好的是工作流程很简单。我仍在寻找更好的解决方案。

附:这个网站可能有不同的用户同时运行,所以保留一个全局变量对我来说听起来不合适。

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 1970-01-01
    • 2018-01-22
    • 2019-02-04
    • 2012-08-05
    • 1970-01-01
    • 2017-11-30
    • 2020-01-24
    相关资源
    最近更新 更多