質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

3282閲覧

Railsで条件を絞り込んだCSVを出力したい

toshir32

総合スコア1

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/10/24 13:12

編集2020/10/24 23:45

前提・実現したいこと

Railsで条件で絞り込んだCSVファイルを出力したい

こちらのWebページを参考に、RailsでCSV出力機能を実装しています。

【CSV.generate】RailsでCSVファイルを出力する方法

発生している問題

Viewからlink to、GETメソッドを使ってフォームの値がURLパラメーターとして送信できない。

該当のソースコード

上記ページ、こちらのコードの @users = User.all の部分を、@users = User.Where(name: params[:name]) として
viewから渡ってきたパラメーターにより条件で絞り込んだCSVファイルを作成したいです。

require 'csv' class UsersController < ApplicationController # GET /users # GET /users.json def index @users = User.all respond_to do |format| format.html format.csv do |csv| send_users_csv(@users) end end end def send_users_csv(users) csv_data = CSV.generate(row_sep: "\r\n", encoding:Encoding::CP932) do |csv| header = %w(名前 住所 電話番号 性別 メールアドレス メール受信) csv << header users.each do |user| values = [user.name,user.address,user.phone,user.sex,user.mail_address,user.email_permission] csv << values end end send_data(csv_data, filename: "users.csv") end end

View側のlink_to〜の行をform_withで作ったファイルに設置し、フォームの入力値(@name)をURLパラメーターとして
送信できるよう name: #{@name} のように記述しましたが、値が引き渡せないです(空になります)
name: "hogehoge" と直接値を入れた場合は、パラメーターが生成されますが。

この記述に誤りがありますでしょうか。

<%= link_to "CSV出力",users_path(format: :csv, name: #{@name}) %>

追記:view側のコード(_form.html.erb)

<section class="content"> <%= form_with url: files_path, method: :get, local: true do |form| %> <div class="card-body"> <div class="form-group col-sm-6"> <%= form.label :名前 %> <%= form.text_field :name, class:"form-control", placeholder:"名前" %> </div> <div class="card-footer"> <%= link_to "CSV出力", files_path(format: :csv, name:#{@name}), class:"btn btn-primary" %> </div> <% end %> </section>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/10/24 23:05

> View側のlink_to〜の行をform_withで作ったファイルに設置し それを表示するコントローラー側のコードはどこでしょうか?
toshir32

2020/10/24 23:49 編集

URLの方を修正しました。ありがとうございます。 >それを表示するコントローラー側のコードはどこでしょうか? こちらの方、View側のコードだと思うのですが、フォームを表示している部分を追加しました。 コントローラー側のコードは本文の以下の部分です。 require 'csv' class UsersController < ApplicationController # GET /users # GET /users.json ・ ・ ・
guest

回答1

0

ベストアンサー

この記述に誤りがありますでしょうか。

はい、コントローラー側で@nameという変数は定義されていませんので、これはnilです。

投稿2020/10/24 23:51

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/10/24 23:52

その場で入れた名前を反映したいのであれば、link_toで単なるリンクを作るのではなく、submitボタンを設置してフォーム送信を行うのが適切です。
toshir32

2020/10/24 23:59

ありがとうございます。Viewこの部分ですが、修正前のものを貼ってしまい、正しくはこうでしたm(__)m <%= form.text_field :@name, class:"form-control", placeholder:"名前" %>
maisumakun

2020/10/25 00:05

どちらにしても、Railsの仕事は「HTMLを作成するまで」ですので、Railsの処理だけでは入力した値がその場で反映されることはありません。
toshir32

2020/10/25 00:12

ありがとうございます。フロントエンド側の理解が足りませんでした。。 https://railsdoc.com/form#submit こちらを参考にsubmitボタンに差し替えます。
toshir32

2020/10/25 08:01

maisumakunさん、本当にありがとうございました! 無事値を渡すことに成功しました。 1. _form.index.htmlの、link_toの行をこちらに差し替え <%= form.submit "CSV出力", class:"btn btn-primary" %> 2. Chromeの開発ツールで、URLパラメータに値がセットされていることを確認 3. _form.index.htmlのに下記の行を追加(submitボタンの前) <%= hidden_field_tag :format, "csv" %>  (<%= link_to "CSV出力",users_path(format: :csv) %>の、format: :csvに相当) 4. submitボタンで条件が絞られたCSVが出力されることを確認 5. controller側はparams[:name]で値を取り出せました。  @users = User.Where(name: params[:name])  params.permitも必要ですね。  params.permit(:name) ※CSV出力後ボタンが不活性になりますが、そちらは対処できそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問