前提・実現したいこと
データの登録を失敗した後にエラーメッセージの出現と指定のパスに遷移させたいが、@itemの情報が取得できないらしく、エラーが発生してしまう。
発生している問題・エラーメッセージ
NoMethodError in Buys#create Showing /Users/username/projects/furima/app/views/buys/index.html.erb where line #10 raised: undefined method `image' for nil:NilClass Extracted source (around line #10): 8 <%# 購入内容の表示 %> 9 <div class='buy-item-info'> 10 <%= image_tag @item.image, class: 'buy-item-img' %> 11 <div class='buy-item-right-content'> 12 <h2 class='buy-item-text'> 13 <%= @item.name %>
該当のソースコード
app/views/buys/index.html.erb
ruby
1<%= render "shared/second-header"%> 2 3<div class='transaction-contents'> 4 <div class='transaction-main'> 5 <h1 class='transaction-title-text'> 6 購入内容の確認 7 </h1> 8 <%# 購入内容の表示 %> 9 <div class='buy-item-info'> 10 <%= image_tag @item.image, class: 'buy-item-img' %> 11 <div class='buy-item-right-content'> 12 <h2 class='buy-item-text'> 13 <%= @item.name %> 14 </h2> 15 <div class='buy-item-price'> 16 <p class='item-price-text'>¥<%= @item.price %></p> 17 <p class='item-price-sub-text'><%= @item.shipping_fee.name %></p> 18 </div> 19 </div> 20 </div> 21 <%# /購入内容の表示 %> 22 23 <%# 支払額の表示 %> 24 <div class='item-payment'> 25 <h1 class='item-payment-title'> 26 支払金額 27 </h1> 28 <p class='item-payment-price'> 29 ¥<%= @item.price %> 30 </p> 31 </div> 32 <%# /支払額の表示 %> 33 34 <%= form_with model: @buy_form, url: item_buys_path, id: 'charge-form', class: 'transaction-form-wrap',local: true do |f| %> 35 <%= render 'shared/error_messages', model: f.object %> 36 <%# カード情報の入力 %> 37 <div class='credit-card-form'> 38 <h1 class='info-input-haedline'> 39 クレジットカード情報入力 40 </h1> 41 <div class="form-group"> 42 <div class='form-text-wrap'> 43 <label class="form-text">カード情報</label> 44 <span class="indispensable">必須</span> 45 </div> 46 <%= f.text_field 'hoge', class:"input-default", id:"card-number", placeholder:"カード番号(半角英数字)", maxlength:"16" %> 47 <div class='available-card'> 48 <%= image_tag 'card-visa.gif', class: 'card-logo'%> 49 <%= image_tag 'card-mastercard.gif', class: 'card-logo'%> 50 <%= image_tag 'card-jcb.gif', class: 'card-logo'%> 51 <%= image_tag 'card-amex.gif', class: 'card-logo'%> 52 </div> 53 </div> 54 <div class="form-group"> 55 <div class='form-text-wrap'> 56 <label class="form-text">有効期限</label> 57 <span class="indispensable">必須</span> 58 </div> 59 <div class='input-expiration-date-wrap'> 60 <%= f.text_area 'hoge', class:"input-expiration-date", id:"card-exp-month", placeholder:"例)3" %> 61 <p>月</p> 62 <%= f.text_area 'hoge', class:"input-expiration-date", id:"card-exp-year", placeholder:"例)23" %> 63 <p>年</p> 64 </div> 65 </div> 66 <div class="form-group"> 67 <div class='form-text-wrap'> 68 <label class="form-text">セキュリティコード</label> 69 <span class="indispensable">必須</span> 70 </div> 71 <%= f.text_field "hoge",class:"input-default", id:"card-cvc", placeholder:"カード背面4桁もしくは3桁の番号", maxlength:"4" %> 72 </div> 73 </div> 74 <%# /カード情報の入力 %> 75 76 <%# 配送先の入力 %> 77 <div class='shipping-address-form'> 78 <h1 class='info-input-haedline'> 79 配送先入力 80 </h1> 81 <div class="form-group"> 82 <div class='form-text-wrap'> 83 <label class="form-text">郵便番号</label> 84 <span class="indispensable">必須</span> 85 </div> 86 <%= f.text_field 'post_code', class:"input-default", id:"postal-code", placeholder:"例)123-4567", maxlength:"8" %> 87 </div> 88 <div class="form-group"> 89 <div class='form-text-wrap'> 90 <label class="form-text">都道府県</label> 91 <span class="indispensable">必須</span> 92 </div> 93 <%= f.collection_select(:prefecture_id, Prefecture.all, :id, :name, {}, {class:"select-box", id:"prefecture"}) %> 94 </div> 95 <div class="form-group"> 96 <div class='form-text-wrap'> 97 <label class="form-text">市区町村</label> 98 <span class="indispensable">必須</span> 99 </div> 100 <%= f.text_field 'city', class:"input-default", id:"city", placeholder:"例)横浜市緑区"%> 101 </div> 102 <div class="form-group"> 103 <div class='form-text-wrap'> 104 <label class="form-text">番地</label> 105 <span class="indispensable">必須</span> 106 </div> 107 <%= f.text_field 'address', class:"input-default", id:"addresses", placeholder:"例)青山1-1-1"%> 108 </div> 109 <div class="form-group"> 110 <div class='form-text-wrap'> 111 <label class="form-text">建物名</label> 112 <span class="form-any">任意</span> 113 </div> 114 <%= f.text_field 'building', class:"input-default", id:"building", placeholder:"例)柳ビル103"%> 115 </div> 116 <div class="form-group"> 117 <div class='form-text-wrap'> 118 <label class="form-text">電話番号</label> 119 <span class="indispensable">必須</span> 120 </div> 121 <%= f.text_field 'phone_number', class:"input-default", id:"phone-number", placeholder:"例)09012345678",maxlength:"11"%> 122 </div> 123 </div> 124 <%# /配送先の入力 %> 125 <div class='buy-btn'> 126 <%= f.submit "購入" ,class:"buy-red-btn" %> 127 </div> 128 <% end %> 129 </div> 130</div> 131<%= render "shared/second-footer"%>
app/controller/buys_controller.rb
class BuysController < ApplicationController def index @buy_form = BuyForm.new @item = Item.find(params[:item_id]) end def create @buy_form = BuyForm.new(buy_params) if @buy_form.valid? @buy_form.save redirect_to root_path else render action: :index end end private def buy_params params.require(:buy_form).permit(:post_code, :prefecture_id, :city, :address, :building, :phone_number, :item_id, :user_id) end end
routes.rb
Rails.application.routes.draw do devise_for :users root to: "items#index" resources :items do resources :buys ,only: [:index, :create] end end
試したこと
buysコントローラー内のcreateアクションのif文中のrender action: :indexで送った際に、itemの情報が反映されなくなってしまったと思うのですが、どの部分を追加・変更すればいいのか分からなくて質問しました。
補足情報(FW/ツールのバージョンなど)
Rails 6.0.3.4
ruby 2.6.5
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。