joppot

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

プログラミング

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

投稿日:

Pocket

f

概要

みなさんこんにちは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ファイルはなんでも良いです。

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のaws-sdk gemを使ってs3のフォルダ(folder)を削除する

概要 みなさんこんにちはcandleです。今回はs3にあるフォルダを丸ごとrailsのaws-sdk gemを使用して削除してみたいと思います。 実はこの方法を確立するまですごく四苦八苦しました。なん …

phpでcompassを使った開発の仕方

概要 みなさんこにちはcandleです。今回はphpでcompassを使いたいと思います。 compassは別名scssともいいます。 compassはphpのライブラリが既にあります。 しかし、その …

railsのform_forとstrong parametersを使用してpdfをアップロードする

概要 みなさんこんにちはcandleです。今回はrailsのform_forを使って、railsプロジェクトのpublicディレクトリにpdfファイルをアップロードしてみましょう。 form_forは …

PEARのDBライブラリのインストールと使い方

概要 みなさんこんにちはcandleです。PEARには複数の便利なライブラリがあります。 その中の1つに実はもう古くなってあまり推奨されていませんが、データベースにつないだり、データベースの値を取得す …

railsのscaffoldでremote formで送信後jsonを取得する

概要 みなさんこんにちはcandleです。 今回はrailsのformをremoteを使ってajaxした時に、 サーバに送った値をjavascript側で受け取る方法を紹介します。 ちなみに、私は下の …

  • English
  • 日本語

プロフィール


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

スポンサードリンク

アーカイブ