【Rails】link_to で formatの指定


タイトルのとおり、link_toメソッドでフォーマットを指定する方法についてです

かなり簡単ですが、意外と記事がヒットしなかったので備忘録的として残しておきます

そもそもformatって?

出力形式のことです
通常はhtml形式で、htmlファイルがレンダリングされてますよね
他にもjson形式やpdf、csvなどがあります

今回はPDFの出力を想定してやってみます

linkの書き方

pathの引数にformatを指定するだけです!

slimファイル
= link_to '表示名', xxx_path(format: :pdf)

他にidを指定したり、parameterを設定する場合にも同じ様に引数に突っ込んじゃってOKです

slimファイル
= link_to '表示名', xxx_path(format: :pdf, id: @post, parameter_name: parameter_content)

コントローラでの処理

コントローラではformatを指定して処理を記述すればOK
pdfの場合はsend_fileを使ってファイルを表示させたりダウンロードさせたりすることが多いと思います。
次のように記述すると、ファイル名を指定してブラウザ上でPDFファイルを開いてくれます

コントローラ
class HogesController < ApplicationController
  def show
    respond_to do |format|
      format.pdf do
        send_file(pdf_path, filename: filename, disposition: 'inline')
      end
    end
  end

  private

  def pdf_path
    # pdfの保存場所を指定
    @post.pdf.path # ← carrierwave使ってればこんな感じかな
  end

  def filename
    # pdfのファイル名を指定
    "#{@post.id}.pdf"
  end
end

余談

rails routesをするとURIパターンの中に(.:format)ってありますよね
これがformat指定したときのURIになります

たとえば今回のようにformatをpdfにした場合は、URLがhttps://xxxxxx/xxx.pdfみたいになります
フォーマットに応じて末尾に.フォーマット形式の形で追加されるってことなんですね〜