joppot

コピペで絶対動く。説明を妥協しない

プログラミング

ruby on railsでpdfファイルをダウンロードさせる

投稿日:

Pocket

f

概要

みなさんこんにちはcandleです。pdfファイルのダウンロードのやり方を紹介します。

前提

railsの環境が出来ている

twitterbootstrap gem を使用した環境で説明して行きます。twitterbootstrap gem事態はデザインのライブラリみたいなものなので、必ずしも入れる必要はありません。

SPONSORED LINK


サンプル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ファイルはなんでも良いです。

publicgoodpdf


決まった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」です。
こんな感じです。

pdfdownloadlink

routeを設定する

ルーティングの設定をします。
/config/routes.rbを開いて下の記述を書き込みます。
「myfiles」のところはコントローラー名です。各自のコントローラー名を指定してください。

 get 'myfiles/downloadpdf/download'=> 'myfiles#downloadpdf'

これだけで、スタティクなpdfのダウンロードは完成です。

サーバを起動する

bundle exec rails s

サイトにアクセスすると、ダウンロードリンクが表示されています。

pdflinkview

リンクを踏むと、pdfがダウンロードされます。

donwloadpdffile


レコードのidに紐づくpdfを動的にダウンロードする

上では決められたgood.pdfをダウンロードしましたが、実用的なサービスにするには、テーブルに収められているレコードに紐づいたpdfファイルを動的にダウンロードしたいと思います。

例えば、下の図の様に、good.pdfとinfo.pdfがある場合、横のボタンからDownloadそれぞれのファイルがダウンロードできると便利です。

downloadimage

info.pdfをアップロードしておく
publicフォルダにinfo.pdfをアップロードしておいてください。

publicpdfs

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' %>

こんな感じ

dynamicpdfdownloadpath

これだけで完成です。

サイトに移動してdownloadボタンを押すと、データベースに対応したファイルがダウンロードされます。
getinfopdffile

download


まとめ

railsを使うと、説明がどうしてもコントローラーやビューなどの環境によって異なってしまうので難しいですね。
よくわからないかったらスミマセン。railsをもっと勉強して、より分かりやすく説明できるように心がけます。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-プログラミング
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Railsの正規表現を使用して文字列から任意の文字を取得する

概要 みなさんこんにちはcandleです。今回はrailsの正規表現を使って任意の文字を文字列から取得する方法を紹介します。 rails4になってからなのか、railsはrubyであるにもかかわらず、 …

ruby on railsのckeditorをdeviseを用いて複数人で投稿できるようにする

概要 みなさんこんにちはcandleです。今回はckeditorの複数人投稿機能をdeviseを用いてやってみたいと思います。ckeditorを使うと分かると思うのですが、誰でも画像のアップロードや削 …

railsのfluent-loggerとdevise gemを使ってユーザーの行動をfluentdサーバに収集する

概要 fluentdと言えば、ビックデータで扱うようなデータを集め出力するサーバですが、これとrailsのfluent-logger gemとdevise gemを組み合わせてユーザーの行動ログをとっ …

正規表現を極めるその2

概要 みなさんこんにちはcandleです。今回は前回に引き続き、正規表現を勉強していきましょう。   前提 unixを使用するので、多少、unixコマンドになれていること   サン …

ruby on railsのgemのインストールで不要なファイルをインストールしない設定

概要 みなさんこんにちはcandleです。私の記事はどうしても先人のプログラマーがまとめた内容を追試しているような感じになっていますが、これも重要なことなので、忘れないためにもまとめておきます。 ru …

  • English
  • 日本語

プロフィール


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー

スポンサードリンク

アーカイブ