概要
みなさんこんにちはcandleです。pdfファイルのダウンロードのやり方を紹介します。
前提
railsの環境が出来ている
twitterbootstrap gem を使用した環境で説明して行きます。twitterbootstrap gem事態はデザインのライブラリみたいなものなので、必ずしも入れる必要はありません。
サンプルscaffoldを用意する
早速、scaffoldを作ります。下のコマンドを実行しましょう。
今回はscaffoldの記事ではないので、細かく説明はしません。
rails g scaffold Myfile title:string filename:string comment:string
マイグレーションファイルが作成されますので、それをデータベースに反映させます。
rake db:migrate
scaffoldが完成しました。
twitterbootstrap gemのスタイルを反映させる
もしも、twitterbootstrap gemがインストールされているなら、次のコマンドを入力して、テーマを反映させます。
bootstrapのレイアウトを適応させます。あまり良い選択肢ではないかもしれませんが、app/views/layouts/application.html.erbに上書きします。
rails g bootstrap:layout application
もちろん、application.html.erbを上書きしてよいのか聞いてきますので許可しましょう。
bootstrapのテーマをMyfileコントローラーのviewに反映させるには下のコマンドを打ちます。
今回はMyfileモデルを作ったので、Myfilesを指定します。
rails g bootstrap:themed Myfiles
これを実行すると、テーマが自動的に書き込まれます。
実行すると分かる様に、すでにscaffolldで作成したファイルが存在するので、コンフリクト(衝突)が起きてしまいます。上書きをそれぞれ許可しましょう。質問されたら「y」と答えれば良いです。
これでbootstrapのテーマがスキャホールドに反映されました
pdfを適切な場所に置く
pdfファイルをrailsプロジェクトのpublicフォルダの中に置きましょう。
私は「bootstrap3」というプロジェクトの中のpublic フォルダに「good.pdf」を置きました。pdfファイルはなんでも良いです。
決まったpdfをダウンロードする
アクションを用意する
Myfileコントローラーに、「downloadpdf」アクションを作ります。
/app/controllers/myfiles_controller.rb
def downloadpdf file_name="good.pdf" filepath = Rails.root.join('public',file_name) stat = File::stat(filepath) send_file(filepath, :filename => file_name, :length => stat.size) end
このアクションはこれだけです。
viewにダウンロード用のリンクを貼る
/app/views/application.html.erbを開きます。
中に下のリンクを記述します。
<%= link_to "PDFファイル",{:controller => "myfile",:action=>"downloadpdf"} %>
:controllerのところは各自のコントローラーをしてしてください。私は「myfile」です。
こんな感じです。
routeを設定する
ルーティングの設定をします。
/config/routes.rbを開いて下の記述を書き込みます。
「myfiles」のところはコントローラー名です。各自のコントローラー名を指定してください。
get 'myfiles/downloadpdf/download'=> 'myfiles#downloadpdf'
これだけで、スタティクなpdfのダウンロードは完成です。
サーバを起動する
bundle exec rails s
サイトにアクセスすると、ダウンロードリンクが表示されています。
リンクを踏むと、pdfがダウンロードされます。
レコードのidに紐づくpdfを動的にダウンロードする
上では決められたgood.pdfをダウンロードしましたが、実用的なサービスにするには、テーブルに収められているレコードに紐づいたpdfファイルを動的にダウンロードしたいと思います。
例えば、下の図の様に、good.pdfとinfo.pdfがある場合、横のボタンからDownloadそれぞれのファイルがダウンロードできると便利です。
info.pdfをアップロードしておく
publicフォルダにinfo.pdfをアップロードしておいてください。
downloadpdf関数を書き換える
下のようにします。
def downloadpdf myfile=Myfile.find(params[:id]) filepath = Rails.root.join('public',myfile.filename) stat = File::stat(filepath) send_file(filepath, :filename => myfile.filename, :length => stat.size) end
routesを変更する
routes.rbの下の記述を
get 'myfiles/downloadpdf/download'=> 'myfiles#downloadpdf'
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
get 'myfiles/downloadpdf/:id'=> 'myfiles#downloadpdf' ,as: :donwload_pdf
に変更します。
application.htmlを変更
上の説明にあった静的なpdfダウンロードを試した方は
application.htmlに書いた下の記述を削除します。
<% link_to "PDFファイル",{:controller => "myfiles",:action=>"downloadpdf"} %>
index.htmlを変更
editとかdeleteとかのボタンが有るところに、下のリンクを貼り付けます。
<%= link_to 'download',donwload_pdf_path(myfile), :class => 'btn btn-default btn-xs' %>
こんな感じ
これだけで完成です。
サイトに移動してdownloadボタンを押すと、データベースに対応したファイルがダウンロードされます。
まとめ
railsを使うと、説明がどうしてもコントローラーやビューなどの環境によって異なってしまうので難しいですね。
よくわからないかったらスミマセン。railsをもっと勉強して、より分かりやすく説明できるように心がけます。