質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

2回答

804閲覧

親要素のIDに紐づく子要素のレコード全てを表示したい

aki_aki

総合スコア3

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2022/01/15 08:54

現在、railsでcocoonとprawnを使ってpdfに出力する帳票を作成しています。
入力フォームで登録した値をpdfで表示したいです。
cocoonで動的な入力フォームは完成しており、prawnでpdfの出力はできている状態です。
親要素の値は全て表示できているのですが、その親要素のIDに紐づく複数の子要素の表示がうまくいきません。eachなどで繰り返し処理を試してみたりしましたが、うまくいきません。
何かいい方法があればよろしくお願いします。

エラーメッセージ

該当のソースコード

rails

1class CostPdfsController < ApplicationController 2 before_action :set_cost_pdf, only: [:edit, :update, :destroy] 3 before_action :authenticate_user! 4 before_action :move_to_index, only: [:edit] 5 6 def index 7 @cost_pdfs = CostPdf.where(user_id: current_user.id) 8 @search_cost = CostPdf.ransack(params[:q]) 9 @cost_pdfs = @search_cost.result(distinct: true).order('created_at DESC') 10 end 11 12 def new 13 @cost_pdf = CostPdf.new 14 @quotation = @cost_pdf.quotations.build 15 end 16 17 def create 18 @cost_pdf = CostPdf.new(cost_pdf_params) 19 if @cost_pdf.save 20 redirect_to cost_pdfs_path 21 else 22 render :new 23 end 24 end 25 26 def edit 27 end 28 29 def update 30 if @cost_pdf.update(cost_pdf_params) 31 redirect_to cost_pdfs_path 32 else 33 render :edit 34 end 35 end 36 37 def destroy 38 @cost_pdf.destroy 39 redirect_to cost_pdfs_path 40 end 41 42 def prawn 43 @cost_pdf = CostPdf.find(params[:id]) 44 # binding.pry 45 @quotations = @cost_pdf.quotations.where(cost_pdf_id:params[:id]) 46 respond_to do |format| 47 format.html 48 format.pdf do 49 cost_pdf = PracticePdf::CostPdf.new(@cost_pdf, @quotations) 50 send_data cost_pdf.render, 51 filename: 'cost_pdf.pdf', 52 type: 'application/pdf', 53 disposition: 'inline' 54 end 55 end 56 end 57 58 private 59 60 def cost_pdf_params 61 params.require(:cost_pdf).permit(:company_name, :postal_code, :address, :tell, :fax, :delivery_date, 62 :delivery_location, :payment_terms, :expiration_date, :subtotal, :tax, 63 :total, :cliant_name, :memo, quotations_attributes:[:id, :product_name, 64 :quantity, :unit, :unit_price, :money, :remarks, :_destroy]).merge(user_id: current_user.id) 65 end 66 67 def set_cost_pdf 68 @cost_pdf = CostPdf.find(params[:id]) 69 end 70 71 def move_to_index 72 unless user_signed_in? && current_user.id == @cost_pdf.user_id 73 redirect_to user_session_path 74 end 75 end 76 77end 78

ruby

1module PracticePdf 2 class CostPdf < Prawn::Document 3 def initialize(cost_pdf, quotation) 4 super(page_size: 'A4') 5 stroke_axis 6 7 ipaexm_path = "#{Rails.root}/app/assets/fonts/ipaexm.ttf" 8 ipapm_spec = {file: ipaexm_path, font: 'IPAPMincho'} 9 font_families.update("ipapm" => {normal: ipapm_spec, 10 bold: ipapm_spec, 11 italic: ipapm_spec, 12 bold_italic: ipapm_spec}) 13 font "ipapm" 14 @cost_pdf = cost_pdf 15 @quotation = quotation 16 create_title 17 end 18 def create_title 19 text '御 見 積 書', size: 20, align: :center 20 stroke_horizontal_line 180, 340, :at=> 750 21font_size = 16 22 move_down 55 23 text_box("#{Time.now.strftime("%Y年%m月%d日")}", 24 :at => [0, y], 25 :width => bounds.right, 26 :align => :right) 27 bounding_box([70, 680], width: 310, height: 65) do 28 text @cost_pdf.cliant_name, size: 12, align: :left 29 end 30 bounding_box([200, 680], width: 310, height: 65) do 31 text "御中", size: 12, align: :left 32 end 33 bounding_box([33, 650], width: 310, height: 65) do 34 text "下記の通り御見積り申し上げます。", size: 12, align: :left 35 end 36 bounding_box([40, 620], width: 310, height: 65) do 37 text "1.受渡期日 #{@cost_pdf.delivery_date}", size: 12, align: :left 38 end 39 bounding_box([40, 600], width: 310, height: 65) do 40 text "2.納入場所 #{@cost_pdf.delivery_location}", size: 12, align: :left 41 end 42 bounding_box([40, 580], width: 310, height: 65) do 43 text "3.支払条件 #{@cost_pdf.payment_terms}", size: 12, align: :left 44 end 45 bounding_box([40, 560], width: 310, height: 65) do 46 text "4.有効期限 #{@cost_pdf.expiration_date}", size: 12, align: :left 47 end 48 bounding_box([305, 693], width: 310, height: 65) do 49 text "〒#{@cost_pdf.postal_code}", size: 12, align: :left 50 end 51 bounding_box([308, 680], width: 310, height: 65) do 52 text @cost_pdf.address, size: 12, align: :left 53 end 54 bounding_box([308, 665], width: 310, height: 65) do 55 text @cost_pdf.company_name, size: 12, align: :left 56 end 57 bounding_box([308, 648], width: 310, height: 65) do 58 text "TEL#{@cost_pdf.tell}/FAX#{@cost_pdf.fax}", size: 12, align: :left 59 end 60 bounding_box([390,610], :width=>270,:height=>360){ 61 table [ 62 ["検 印","担当者印"] 63 ] 64 } 65 bounding_box([89, 535], width: 310, height: 65) do 66 move_down 10 67 text "御 見 積 金 額 ", size: 16, align: :left 68 end 69 bounding_box([135, 535], width: 310, height: 65) do 70 move_down 10 71 text #{@cost_pdf.total.to_s(:delimited)}- (消費税込)", size: 16, align: :right 72 end 73 74 bounding_box([89, 535], width: 310, height: 65) do 75 move_down 10 76 @quotation.each do |quotation| 77 text quotation.product_name, size: 16, align: :left 78 end 79 end 80 end 81 bounding_box([6.5, 500], width: 510, height: 65) do 82 rows = [["品 名","数 量","単位","単 価","金 額","備 考"], 83 84 table(rows, column_widths: [200, 45, 35, 60, 80, 90], position: :center) do |table| 85 table.cells.size = 11 86 table.row(0).align = :center 87 end 88 bounding_box([120, 135], width: 310, height: 65) do 89 text "小 計", size: 12, align: :left 90 end 91 bounding_box([100, 135], width: 310, height: 65) do 92 text "#{@cost_pdf.subtotal.to_s(:delimited)}", size: 12, align: :right 93 end 94 bounding_box([120, 115], width: 310, height: 65) do 95 text "消 費 税 等 ( 10% )", size: 12, align: :left 96 end 97 bounding_box([100, 115], width: 310, height: 65) do 98 text "#{@cost_pdf.tax.to_s(:delimited)}", size: 12, align: :right 99 end 100 bounding_box([120, 95], width: 310, height: 65) do 101 text "合 計", size: 12, align: :left 102 end 103 bounding_box([100, 95], width: 310, height: 65) do 104 text "#{@cost_pdf.total.to_s(:delimited)}", size: 12, align: :right 105 end 106 bounding_box([10, 75], width: 310, height: 65) do 107 text "備 考:", size: 12, align: :left 108 end 109 bounding_box([10, 63], width: 310, height: 65) do 110 text @cost_pdf.memo, size: 12, align: :left 111 112 end 113 114 end 115 end 116end

rails

1<div class="nested-fields"> 2 <div class="form-block" id="form_block[0]"> 3 <div class="row"> 4 <div class="col-md-6 mb-3"> 5 <label for="familyName">品名</label> 6 <%= f.text_field :product_name, class:"form-control", placeholder:"必須" %> 7 <label for="familyName">数量</label> 8 <%= f.text_field :quantity, class:"form-control", placeholder:"任意" %> 9 <label for="givenName">単位</label> 10 <%= f.text_field :unit, class:"form-control", placeholder:"任意" %> 11 </div> 12 <div class="col-md-6 mb-3"> 13 <label for="givenName">単価</label> 14 <%= f.text_field :unit_price, class:"form-control", placeholder:"任意" %> 15 <label for="givenName">金額</label> 16 <%= f.text_field :money, class:"form-control", id:"money-cost[0]", placeholder:"必須" %> 17 <label for="familyName">備考</label> 18 <%= f.text_field :remarks, class:"form-control", placeholder:"任意" %> 19 </div> 20 </div> 21 <%= link_to_remove_association "削除", f %> 22 </div> 23 </div> 24

試したこと

@quotations = @cost_pdf.quotations.where(cost_pdf_id:params[:id])

ここに値が入っているのは binding.pryで確認できています。

@quotation.each do |quotation|
quotation.product_neme
end
これは間違っているでしょうか?

補足情報(FW/ツールのバージョンなど)

ruby 2.6.5  rails 6.0.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

質問欄のcodeはコピペしてますか? それとも 手入力し直してますか?
コピペでしたら問題は明確です
@quotations = としているのに、@quotation.each だからです。
もしじつは @quotations.each なのにうまく行かないのだ
としたらもう少しじっくりcode読みます。
その場合 「うまくいかない」ではなく「どの様になった」のかを書いてください。
否定形は何も情報がないので

投稿2022/01/15 11:42

winterboum

総合スコア23329

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aki_aki

2022/01/16 03:42

回答ありがとうございます。 @quotations.eachで実行すると、 NoMethodError in CostPdfsController#prawn undefined method `each' for nil:NilClass Extracted source (around line #131): 129 bounding_box([89, 535], width: 310, height: 65) do 130 move_down 10 131 @quotations.each do |quotation| 132 text quotation.product_name, size: 16, align: :left 133 end 134. end このようなエラーが出てしまいます。
shinoharat

2022/01/16 23:58

横からすみません。 CostPdf クラスの initialize を読む限り、そこは「@quotation.each」で合ってそうな気がします。
aki_aki

2022/01/17 04:46

回答ありがとうございます。 @quotation.eachですとエラーは起きないのですが、何も表示されません。 この場合考えられるのは、前後の記述に問題があるということでしょうか?
shinoharat

2022/01/17 05:13

> 値が入っているのは binding.pryで確認できています。 とのことですが、実際どのようなデータが入っているのでしょうか? 例えば、pry で @quotations.pluck(:id, :product_name) と入力すると、どのような値が返されますか?
aki_aki

2022/01/17 05:47

@quotations.pluck(:id, :product_name)を入力すると NoMethodError: undefined method `pluck' for nil:NilClassが出ました。
winterboum

2022/01/17 12:56

単数形、複数形を正しく使わないと勘違いを起こすので注意したほうが良いです。 class CostPdf のなかの quotation 、@quotation は全部複数形に直しましょう。 その上で shinoharat さんの 2022/01/17 14:13 実際どのようなデータが入っているのでしょうか? に対してのテストをしてください。 そうしたら undefined method `pluck' for nil:NilClass は出ません。
aki_aki

2022/01/17 13:23

ありがとうございます。 なんとかできました。もう一度勉強をし直します。
guest

0

(投稿内容に誤りがあったため削除しました)

投稿2022/01/17 04:55

編集2022/01/17 05:06
shinoharat

総合スコア1676

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問