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

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

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

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

Ruby

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

Q&A

解決済

1回答

769閲覧

ActionView::Template::Error (First argument in form cannot contain nil or be empty) で躓いてます

kazuki0714

総合スコア28

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2019/08/26 10:34

編集2019/08/26 11:19

メルカリ風のアプリを作っていて、出品画面 → 出品確認 → 出品完了 の出品完了ページでエラーが発生しました。

エラーで言われている show.html.erb は商品詳細画面なので購入者が画像等をクリックした後に進むページなのですがなぜそこがエラー出るのかなぁと思っています。スクショのコードは商品詳細画面からカート画面へ遷移します。( :url => carts_add_path do |f| )

色々試したのですが解決できないのでアドバイスいただきたいです。
よろしくお願いいたします。

下記スクショがエラー画面です。

イメージ説明

Ruby

1# routes.rb 2 3Rails.application.routes.draw do 4 devise_for :users#, skip: [:sessions] 5 resources :items 6 resources :carts, only: [:show] 7 8 root "top#index" 9 10 post 'carts/add' => 'carts#add' 11 get 'carts/show' => 'carts#show' 12 #get "items/:id" => "carts#new" 13 14 post 'carts/update' => 'carts#update' 15 delete 'carts/delete' => 'carts#delete' 16 post "carts/create" => "carts#create" 17 18 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 19 20 get "users/nologin" => "users#nologin" 21 get "users/mypage/sell_history" => "users#sell_history" 22 23 get "items/complete" => "items#complete" 24 post "items/create" => "items#create" 25 post "items/confirm" => "items#confirm" 26 get "items/new" => "items#new" 27 get "items/:id" => "items#show" 28 29 30end 31

Ruby

1<!-- 新規出品画面 --> 2<!--app/views/new.html.erb --> 3<div class="main item-new"> 4 <div class="container"> 5 <div class="form-heading">新規出品登録</div> 6 <div class="form item-form"> 7 <div class="form-body"> 8 <% @item.errors.full_messages.each do |message| %> 9 <div class="form-error"> 10 <%= message %> 11 </div> 12 <% end %> 13 14 <%=form_tag("/items/confirm",{multipart:true}) do %>    15 <p>商品名</p> 16 <input name="title" value="<%= @item.title %>" id="item_title"> 17 <p>金額</p> 18 <input name="price" value="<%= @item.price %>" id="item_price"> 19 <p>在庫数</p> 20 <input name="stock" value="<%= @item.stock %>" id="item_stock"> 21 <p>商品説明</p> 22 <input name="description" value="<%= @item.description %>" id="item_description"> 23 <p>商品画像</p> 24 <input type="file" name="image" value="<%= @item.image %>" id="item_image"> 25 <input type="submit" value="新規出品登録"> 26 27 <% end %> 28 </div> 29 </div> 30 </div> 31</div> 32

Ruby

1<!-- 出品確認画面--> 2<!-- app/views/confirm.html.erb --> 3 4 <%= form_for @item do |f| %> 5 6 <div> 7 <h2>メッセージ確認</h2> 8 <div> 9 <strong>商品名</strong> 10 <p> 11  <%= f.hidden_field :title %> 12  <%= @item.title %> 13 </p> 14 <strong>商品画像</strong> 15 <p> 16   <%= f.hidden_field :image %> 17 <img src="<%= @item.image %>" width="100"> 18   </p> 19 <strong>価格</strong> 20 <p> 21 <%= f.hidden_field :price %> 22 <%= @item.price %> 23 </p> 24 <strong>在庫数</strong> 25 <p> 26 <%= f.hidden_field :stock %> 27 <%= @item.stock %> 28 </p> 29 <strong>商品説明</strong> 30 <p> 31 <%= f.hidden_field :description%> 32 <%= @item.description %> 33 </p> 34 <p> 35 <%= f.hidden_field :user_id, :value => current_user.id %> 36 </p> 37 </div> 38 <%= f.submit '戻る', name: 'back' %> 39 <%= f.submit '送信する' %> 40 </div> 41 <% end %> 42

Ruby

1<!-- 出品完了画面 --> 2<div class="acms-entry contactBox"> 3 <section class="entryColumn"> 4 <h2 class="contactH2">出品登録完了</h2> 5 <p class="message">出品登録ありがとうございました。</p> 6 </section> 7 8 <%= link_to("商品一覧画面に戻る", "/") %> 9</div> 10

Ruby

1# コメントアウトに試行錯誤したコードも記入しております 2# items_controller.rb 3 4class ItemsController < ApplicationController 5 before_action :authenticate_user! 6 7 def new 8 @item = Item.new 9 end 10 11 def confirm 12 @item = Item.new(title: params[:title],price: params[:price],stock: params[:stock], 13 description: params[:description],image: params[:image],user_id: params[:user_id]) 14 #@item = Item.new(item_params) 15 render :new if @item.invalid? 16 end 17 18 def create 19 @item = Item.new(title: params[:title],price: params[:price],stock: params[:stock],description: params[:description], user_id: params[:user_id]) 20 #item = Item.new(item_params) 21 #@item = @user.items.create!(item_params) 22 23 @item.save 24 redirect_to("/items/complete") 25 26 if params[:image] 27 @item.image ="#{@item.id}.jpg" 28 image = params[:image] 29 File.binwrite("public/item_images/#{@item.id}.jpg", image.read) 30 end 31 32 #if params[:image] 33 # @item.image = "#{@item.item_id}.jpg" #表示先のviewファイルへの記述 <img src="<%= "/item_images/#{@item.image}" %>"> 34 # File.binwrite("public/item_images/#{@item.image}", params[:image].read) 35 #end 36# 37 #if params[:back] 38 # format.html { render :new } 39 #elsif @item.save 40 # flash[:notice] = "出品情報が保存されました" 41 # redirect_to("/items/complete") 42 #else 43 # render("items/new") 44 #end 45 end 46 47 def complete 48 49 end 50 51 def show 52 @item = Item.find(params[:id]) 53 end 54 55 private 56 57 def item_params 58 params.require(:item).permit(:user_id, :title, :price, :stock, :description, :image,carts_attributes:[:quantity]) 59 end 60 61end 62

【追記①】
asm 様のアドバイスを基にコード修正しました。
次のエラーがidが見つからないということでした。
イメージ説明

show.html.erb でid通そうとしたんですが直らず。
イメージ説明

ソースコードも掲載いたします。
アドバイスお願いいたします。

Ruby

1 2<!-- app/views/items/show.html.erb --> 3 <%= form_for @item, :url => carts_add_path do |f| %> 4 <div> 5 <h2>商品詳細</h2> 6 <div class="item-quantity"> 7 <%= f.fields_for :items do |h| %> 8 <strong>購入数</strong> 9 <%= h.number_field :quantity,min:1,max:@item.stock,step:1 %> <br> 10 <% end %> 11 </div> 12 <div> 13 <strong>商品名</strong> 14 <p> 15 <%= f.hidden_field :title %> 16 <%= @item.title %> 17 </p> 18 <strong>商品画像</strong> 19 <p> 20 <%= f.hidden_field :image %> 21 <img src="<%= @item.image %>" width="200"> 22 </p> 23 <strong>価格</strong> 24 <p> 25 <%= f.hidden_field :price %> 26 <%= @item.price %> 27 </p> 28 <strong>在庫数</strong> 29 <p> 30 <%= f.hidden_field :stock %> 31 <%= @item.stock %> 32 </p> 33 <strong>商品説明</strong> 34 <p> 35 <%= f.hidden_field :description%> 36 <%= @item.description %> 37 </p> 38 <%= f.hidden_field :user_id, :value => current_user.id %> 39 <%= f.hidden_field :item_id, :value => current_user.id %> 40 </div> 41 <%= f.submit '戻る', name: 'back' %> 42 <%= f.submit '商品購入に進む' %> 43 </div> 44 <% end %> 45

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

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

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

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

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

guest

回答1

0

ベストアンサー

ruby

1 def show 2 @item = Item.new 3 @item = Item.find_by(id: params[:id]) 4 end

ruby

1 def show 2 @item = Item.find(params[:id]) 3 end

の方がよいでしょう。

問題は、なぜ不正なidがitems#showで入力されるかです。

routes.rbで、記述している順番に問題があるように思います。
get "items/:id" => "items#show"を他のよりも後ろに書くようにしてはいかがでしょうか?

投稿2019/08/26 10:49

asm

総合スコア15147

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

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

kazuki0714

2019/08/26 11:21

回答ありがとうございます! 回答を基にソースコードの書き換えをすると【追記①】のように新たなエラーが生じました。 idが見つからないということで show.html.erb を色々いじったのですが直らずでして、アドバイスいただけますでしょうか?
asm

2019/08/26 11:33 編集

routes.rbの方を修正後に railsの再起動が必要になりますが行いましたか?
kazuki0714

2019/08/26 11:33

はい、質問文の方も修正し、 一番下に持ってくるとスクショのエラーが出てきました。
asm

2019/08/26 13:33

失礼しました。「resources :items」を見逃していました。 resources :itemsでもget "items/:id" => "items#show"と同等の処理が含まれていますので これも、後ろに記述した方がよいでしょう。
kazuki0714

2019/08/27 02:44

ありがとうございます!解決しました! 改めてRails チュートリアル見直してroutesの順番について学んで腹落ちしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問