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

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

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

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

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2482閲覧

NoMethodError in Orders#indexを解決したい

tattobu

総合スコア16

Ruby

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

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/11/17 16:03

前提・実現したいこと

購入機能でエラーメッセージを表示させようと
<%= render 'shared/error_messages', model: f.object %>
をindex.html.erbに追加したところ購入画面(index.html.erb)に遷移することもできなくなり、エラーが起きてしまいます。
f.objectが空だからエラーが起きていると想定は出来るのですがどうすればいいか分からないでいます。よろしければご教授お願い致します。

発生している問題・エラーメッセージ

views/orders/index.html.erb

NoMethodError in Orders#index Showing /Users/tattobu/projects/furima-36479/app/views/shared/_error_messages.html.erb where line #1 raised: undefined method `errors' for nil:NilClass Extracted source (around line #1): <% if model.errors.any? %> <div class="error-alert"> <ul> <% model.errors.full_messages.each do |message| %> <li class='error-message'><%= message %></li> <% end %> Trace of template inclusion: #<ActionView::Template app/views/orders/index.html.erb locals=[]> Rails.root: /Users/tattobu/projects/furima-36479 Application Trace | Framework Trace | Full Trace app/views/shared/_error_messages.html.erb:1 app/views/orders/index.html.erb:36 app/views/orders/index.html.erb:34 Request Parameters: {"item_id"=>"8"}

該当のソースコード

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_status.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 url: item_orders_path, model: @cart_address, id: 'charge-form', class: 'transaction-form-wrap',local: true do |f| %> 35 36 <%= render 'shared/error_messages', model: f.object %> 37 38 <%# カード情報の入力 %> 39 <div class='credit-card-form'> 40 <h1 class='info-input-haedline'> 41 クレジットカード情報入力 42 </h1> 43 <div class="form-group"> 44 <div class='form-text-wrap'> 45 <label class="form-text">カード情報</label> 46 <span class="indispensable">必須</span> 47 </div> 48 <%= f.text_field :card_number, class:"input-default", id:"card-number", placeholder:"カード番号(半角英数字)", maxlength:"16" %> 49 <div class='available-card'> 50 <%= image_tag 'card-visa.gif', class: 'card-logo'%> 51 <%= image_tag 'card-mastercard.gif', class: 'card-logo'%> 52 <%= image_tag 'card-jcb.gif', class: 'card-logo'%> 53 <%= image_tag 'card-amex.gif', class: 'card-logo'%> 54 </div> 55 </div> 56 <div class="form-group"> 57 <div class='form-text-wrap'> 58 <label class="form-text">有効期限</label> 59 <span class="indispensable">必須</span> 60 </div> 61 <div class='input-expiration-date-wrap'> 62 <%= f.text_area :exp_month, class:"input-expiration-date", id:"card-exp-month", placeholder:"例)3" %> 63 <p>月</p> 64 <%= f.text_area :exp_year, class:"input-expiration-date", id:"card-exp-year", placeholder:"例)23" %> 65 <p>年</p> 66 </div> 67 </div> 68 <div class="form-group"> 69 <div class='form-text-wrap'> 70 <label class="form-text">セキュリティコード</label> 71 <span class="indispensable">必須</span> 72 </div> 73 <%= f.text_field :cvc, class:"input-default", id:"card-cvc", placeholder:"カード背面4桁もしくは3桁の番号", maxlength:"4" %> 74 </div> 75 </div> 76 <%# /カード情報の入力 %> 77 78 <%# 配送先の入力 %> 79 <div class='shipping-address-form'> 80 <h1 class='info-input-haedline'> 81 配送先入力 82 </h1> 83 <div class="form-group"> 84 <div class='form-text-wrap'> 85 <label class="form-text">郵便番号</label> 86 <span class="indispensable">必須</span> 87 </div> 88 <%= f.text_field :postal_code, class:"input-default", id:"postal-code", placeholder:"例)123-4567", maxlength:"8" %> 89 </div> 90 <div class="form-group"> 91 <div class='form-text-wrap'> 92 <label class="form-text">都道府県</label> 93 <span class="indispensable">必須</span> 94 </div> 95 <%= f.collection_select(:prefecture_id, Prefecture.all, :id, :name, {}, {class:"select-box", id:"prefecture"}) %> 96 </div> 97 <div class="form-group"> 98 <div class='form-text-wrap'> 99 <label class="form-text">市区町村</label> 100 <span class="indispensable">必須</span> 101 </div> 102 <%= f.text_field :city, class:"input-default", id:"city", placeholder:"例)横浜市緑区"%> 103 </div> 104 <div class="form-group"> 105 <div class='form-text-wrap'> 106 <label class="form-text">番地</label> 107 <span class="indispensable">必須</span> 108 </div> 109 <%= f.text_field :addresses, class:"input-default", id:"addresses", placeholder:"例)青山1-1-1"%> 110 </div> 111 <div class="form-group"> 112 <div class='form-text-wrap'> 113 <label class="form-text">建物名</label> 114 <span class="form-any">任意</span> 115 </div> 116 <%= f.text_field :building, class:"input-default", id:"building", placeholder:"例)柳ビル103"%> 117 </div> 118 <div class="form-group"> 119 <div class='form-text-wrap'> 120 <label class="form-text">電話番号</label> 121 <span class="indispensable">必須</span> 122 </div> 123 <%= f.text_field :phone_number, class:"input-default", id:"phone-number", placeholder:"例)09012345678",maxlength:"11"%> 124 </div> 125 </div> 126 <%# /配送先の入力 %> 127 <div class='buy-btn'> 128 <%= f.submit "購入" ,class:"buy-red-btn", id:"button" %> 129 </div> 130 <% end %> 131 </div> 132</div> 133<%= render "shared/second-footer"%>

controllers/orders_controller.rb

ruby

1class OrdersController < ApplicationController 2 before_action :authenticate_user! 3 4 def index 5 @item = Item.find(params[:item_id]) 6 end 7 8 def new 9 @item = Item.find(params[:item_id]) 10 @cart_address = CartAddress.new 11 end 12 13 def create 14 @cart_address = CartAddress.new(cart_params) 15 if @cart_address.valid? 16 @cart_address.save 17 redirect_to root_path 18 else 19 render template: "order/index" 20 end 21 end 22 23 private 24 25 def cart_params 26 params.require(:cart_address).permit(:postal_code, :prefecture_id, :city, :addresses, :building, :phone_number).merge( 27 user_id: current_user.id, item_id: params[:item_id] 28 ) 29 end 30end

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

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

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

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

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

guest

回答1

0

ベストアンサー

erb

1<%= form_with url: item_orders_path, model: @cart_address, id: 'charge-form', class: 'transaction-form-wrap',local: true do |f| %>

@cart_address が nil のため f.object も nilになっています。
NoMethodError in Orders#index ということなので、この view は Orders#index から呼ばれています。
Orders#index を確認してみると、@cart_address がないので追加します。

def index @item = Item.find(params[:item_id]) # 追加 @cart_address = CartAddress.new end

もしくは、以下のようにして @cart_address が nil の際は CartAddress.new を渡します。

erb

1<%= form_with url: item_orders_path, model: @cart_address || CartAddress.new, id: 'charge-form', class: 'transaction-form-wrap',local: true do |f| %>

投稿2021/11/17 21:21

neko_daisuki

総合スコア2090

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

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

tattobu

2021/11/18 02:06 編集

丁寧に回答してくださりありがとうございます。 教えていただいた通り、 indexアクションに @cart_address = CartAddress.new を追記したところ正常に動作しました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問