Ruby on Rails開発のインターン (Day 35)
こんにちは、皆さん!
ついにインターン終了まであと1日のところまでやってきた。引き続きデータインポートの機能実装をやっていく方針。今のところ、リダイレクトできないから、何か問題が起きても画面に何の変化もない。もしかしたら、もっといい方法が見つけて、ユーザーに失敗したときにエラーメッセージを返せれたらなというところだね。
- トピック:
- 疑問:
- 問題:
- 学習した内容:
- Railsでダウンロードボタンを追加する方法
- 今後やってみたいこと:
- リソース:
- ruby on rails - How to create a download button (link) for a local image (png) - Stack Overflow
- ruby - Rails Global Variable becomes nil across controller actions - Stack Overflow
とりあえず、ダウンロードボタンの基本はこう:
<%= link_to "Download", action: :download %>
これがごく普通のダウンロードというアクションを控えたリンクの作り方。
しかし、これだけではdownload
アクションが定義されていないことになる。なので、このダウンロードボタンのあるビューが所属するコントローラーに行き、download
アクションを関数として追加する。
この関数はユーザーにファイルをダウンロードさせるだけで特に他のことはしないので、中身はだいたい下記のような感じになる。
def download send_data to_csv, filename: "error_lines.csv" end
send_data
について以前のブログを参照するとよいでしょう
こうやって書くと、 "error_lines.csv"というファイルをユーザーに送ることになる。
よし、これでダウンロードボタンの機能はほぼ完成!
だが、ほとんどの場合、このボタンをスタイリングしたいことでしょう。特にお手頃のBootstrapでこうやって
<%= link_to "Download", action: :download, class: "btn btn-primary" %>
そして、ローカルサーバーで開いてみると、あれっ!!!ボタンがスタイルされていない!ってなるはず。
僕も同じエラーが起き、いったいなぜなのかディベロッパーツールを使って確認すると、ボタンが下記のようになっていることに気が付いたのだ。
それでこれがlink_to
というアクションをHTMLタグの中でどのように使うのかに問題があるのだと思った。
そして、いろいろ試した結果下記のでうまくいった。
<%= link_to "Download", {action: :download}, class: "btn btn-primary" %>
そう、つまり、アクションの部分を{}に入れる必要があったのだ。これでどこからどこまでがアクションなのかわかるというわけだ。
グローバル変数の代用
$
を変数の前につける)
class UsersController < ApplicationController $var = Array.new ... end
これでそれぞれのアクションの中で$var
というようにこの変数にアクセスできる。
しかし、これはHerokuにプッシュすると、うまくいかなかった。どうやら以前に投稿したグローバル変数がメモリ容量を急速に加速させてしまう可能性を秘めているからかHerokuではリダイレクトしたり、レンダーをすると、グローバル変数をすべて削除してしまう。なので、他のアクションでその値を定義した後にその関数をアクセスしようとすると、想定していた値がそこにはなかった。少し調べてみたが、グローバル変数という選択肢は存在するが、やはり、使わない方がいいというのが一般的な考えだった。
それで探してみたら、かわりにその値をハッシュに入れるのだった。職場のプログラムではログイン機能があったため、セッションのハッシュを使うことにした。
session[:var] = Array.new
値を保存し、様々なコントローラーでも使えるので、かなり重宝できる使用法だと思う。そして、こんな有用なものが学べたことに感謝する。
まとめ
ご精読ありがとうございました。では、また次回まで✌