One struggle more

情報系学生の戦闘記録

Railsにダウンロード機能

Railsにダウンロード機能を加えてみた。

今回はアップロードしダウンロードするまでをRailsを用いて実現しましょう。

まずはターミナルで以下のコマンドをうち、ファイルを作りましょう。

$ rails new Sampledownload   

次にScaffoldでCRUDを実装しDBに反映させよう。

$ rails g scaffold Sample image:binary

$ rails db:migrate

次に画像をアップロードし表示する準備をします。 Gemfileに今回はcarrierwaveを記述しインストールします。

gem "carrierwave" 

$ bundle insstall

次にUploaderクラスの作成

$ rails g uploader image

次にmodelクラスへ作成したUploaderを設定します。

今回はsample.rbに以下のコードを書き込みます。

  mount_uploader :image,ImageUploader
次にformのビューを変更しましょう。

今回はルーティングの設定は行わないので$ rails routesで確認しながら作業をおこなってください。 現状だとsamples/_form.html.erbは以下の通りになっており

  <div class="field">
    <%= form.label :image %>
    <%= form.text_field :image, id: :sample_image %>
  </div>

以下のように変更します。

  <div class="field">
    <%= form.label :image %>
    <%= form.file_field :image, id: :sample_image %>
  </div>
次に画像を表示させるためのビューを変更しましょう。

では、samples/show.html.erbをいじっていきます。 初期状態を

<p>
  <strong>Image:</strong>
  <%= @sample.image %>
</p>

以下のように変える。(表示するにはimage_tagを用いる)

<p>
  <strong>Image:</strong>
  <%=image_tag @sample.image %>
</p>
ではでは、最後にダウンロード機能を加えましょう。

app/controllers/samples_controller.rbファイルに以下のコードを加えます。

  def download
      send_file(@sample.path)
  end

さらにbefore_actionに:downloadと加えましょう。

  before_action :set_sample, only: [:show, :edit, :update, :destroy,:download]

そしてconfig/routes.rbを以下のように変更します。

     member do
       get "download"
     end

すると、ターミナルにてrails routesコマンドを実行するとdownload_sample GET /samples/:id/download(.:format) samples#download が現れ、これを元にsamples/index.html.erbに以下のコードのように変更しましょう。

    <% @samples.each do |sample| %>
      <tr>
        <td><%= sample.image %></td>
        <td><%= link_to 'Show', sample %></td>
        <td><%= link_to 'Edit', edit_sample_path(sample) %></td>
        <td><%= link_to 'Download', download_sample_path(sample) %></td>
        <td><%= link_to 'Destroy', sample, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>