Ruby on Rails開発のインターン (Day 35)

こんにちは、皆さん!

ついにインターン終了まであと1日のところまでやってきた。引き続きデータインポートの機能実装をやっていく方針。今のところ、リダイレクトできないから、何か問題が起きても画面に何の変化もない。もしかしたら、もっといい方法が見つけて、ユーザーに失敗したときにエラーメッセージを返せれたらなというところだね。


  • トピック:
  1. Railsでダウンロードボタンを作る
  2. グローバル変数の代用


  • 疑問:


  • 問題:


  • 学習した内容:
  1. Railsでダウンロードボタンを追加する方法


  • 今後やってみたいこと:


  • リソース:
  1. ruby on rails - How to create a download button (link) for a local image (png) - Stack Overflow
  2. ruby - Rails Global Variable becomes nil across controller actions - Stack Overflow


Railsでダウンロードボタンを作る

これを学習した後、もっと早くこれを習っていたのならと思うくらいだった。すごく優秀な機能であり、アプリの可能性を一気に広げてくれるなと思った。***これからの内容には僕の以前のブログで見つかるような予備知識が必要な場合がある。***

とりあえず、ダウンロードボタンの基本はこう:

<%= 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" %>

そして、ローカルサーバーで開いてみると、あれっ!!!ボタンがスタイルされていない!ってなるはず。
僕も同じエラーが起き、いったいなぜなのかディベロッパーツールを使って確認すると、ボタンが下記のようになっていることに気が付いたのだ。
f:id:Coding_Studio:20180824051438p:plain

それでこれが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

値を保存し、様々なコントローラーでも使えるので、かなり重宝できる使用法だと思う。そして、こんな有用なものが学べたことに感謝する。

まとめ

今日はHeroku上でインポート機能のコードがよりいいUIとUXとともに動くようにコードを書いていった。最終的にはうまくいったのですごく嬉しかった。出来上がった後二度見するくらいダウンロード機能を一つのボタンに組み込んだことがカッコよく思えてしかも大きな達成感を感じた。最終日は何をするのか今のところ何もわからないが、何か面白いことを最後にやらせてくれたらうれしいな。


ご精読ありがとうございました。では、また次回まで✌





Day 34はこちら↓↓
programming-shop.hatenablog.com