Techioz Blog

Ruby on Rails 7 レンダリング .rtf.erb テンプレート

概要

私はRuby on Railsの初心者で、.rtf.erbテンプレートをレンダリングしようとしています。それにはいくつかのサードパーティのプラグインまたはライブラリが必要であることを理解しています。rtf gemライブラリ、rrtfライブラリのようなものを見つけましたが、別の方法で何かをしようとしています。

./views/order.rtf.erb にテンプレートがあり、注文の詳細をこのテンプレートに送信/レンダリングしており、RTF 形式でダウンロードしたいと考えています。

ルビタグを付けた内容は以下のようになります。

.
.
.
\trowd \trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr
\brdrs\brdrw10 \cltxlrtb \cellx3690\clvertalt\cltxlrtb \cellx5940\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx8910\pard \nowidctlpar\widctlpar\intbl\adjustright {\fs16 
\par }\pard\plain \s15\nowidctlpar\widctlpar\intbl\adjustright \fs16\cgrid {\f1 SOLD TO:
\par }\pard\plain \nowidctlpar\widctlpar\intbl\adjustright \fs20\cgrid {\f1 
\par <%= @client_addr.addr1 rescue 'N/A'%>
\par <%= @client_addr.addr2 rescue 'N/A'%>
\par <%= @client_addr.addr3 rescue 'N/A'%>
\par <%= @client_addr.city rescue 'N/A'%>, <%= @client_addr.state rescue 'N/A'%> <%= @client_addr.zipcode rescue 'N/A'%>
\par }{\fs16 \cell }{\cell }{\fs16 
\par }\pard\plain \s15\nowidctlpar\widctlpar\intbl\adjustright \fs16\cgrid {\f1 SHIPPED TO:
\par }\pard\plain \nowidctlpar\widctlpar\intbl\adjustright \fs20\cgrid {\f1 
\par <%= @shipping_addr.addr1 rescue 'N/A'%>
\par <%= @shipping_addr.addr2 rescue 'N/A'%>
\par }\pard\plain \s16\nowidctlpar\widctlpar\intbl\adjustright \fs20\cgrid {\f1 <%= @shipping_addr.addr3 rescue 'N/A'%>
\par }\pard\plain \nowidctlpar\widctlpar\intbl\adjustright \fs20\cgrid {\f1 <%= @shipping_addr.city rescue 'N/A'%>, <%= @shipping_addr.state rescue 'N/A'%> <%= @shipping_addr.zipcode rescue 'N/A'%>
\par }{\fs16 \cell }\pard \nowidctlpar\widctlpar\intbl\adjustright {\row }

\pard \nowidctlpar\widctlpar\adjustright { \par }
.
.
.

私のコントローラーの機能:

def show
    @order = Order.find(params[:id])
    raise NotFound unless @order
    if params[:format] == 'rtf'
      latest_order = Order.find_by(order_type: 'o', customer_id: @order.customer_id)
      if latest_order.nil?
        @client_addr = Customer.find(@order.customer_id).addresses[0]
        @shipping_addr = @client_addr
      else
        @client_addr = latest_order.client_address
        @shipping_addr = latest_order.shipping_address
      end

      # Construct an object representing the RTF document
      rtf = RRTF::Document.new

      #==========================================
      #here I do not have any idea what to do...
      #==========================================
      
      #what i did
      rtf = File.read(Rails.root.to_s+ "/app/views/order.rtf.erb")
      # Convert document into RTF string
      send_data rtf, filename: 'order', type: 'application/rtf'

      #render template: "order.rtf.erb", formats: :rtf, layout: false
  else
    render
  end
end

出力:

解決策

RTF ファイルが動的に生成されない場合は、追加のライブラリは必要ありません。あなたの例では、ERB が埋め込まれた RTF ファイルがあるので、そのファイルを ERB に入れて魔法を実行させるだけの問題です。

次のようなものが機能するはずです。

def show
  # ...

  rtf = File.read(File.join(Rails.root, "/app/views/order.rtf.erb"))
  # Load the file as an ERB template
  erb_template = ERB.new(rtf)
  # Executes the generated ERB code to produce a completed template
  output = erb_template.result(binding)
  # Convert document into RTF string
  send_data output, filename: 'order', type: 'application/rtf'

  # ...
end