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

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

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

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

Ruby on Rails 6

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Q&A

解決済

2回答

6019閲覧

NoMethodError in Users#show のエラーから抜けられません

ke-si

総合スコア6

Ruby

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

Ruby on Rails 6

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

0グッド

0クリップ

投稿2020/04/25 23:29

編集2020/04/26 00:32

undefined method `name' for nil:NilClass となりエラーになります
4行目の@user が定義されてないのでしょうか?

Request

Parameters:

{"id"=>"signup"} 

新規登録のリンクを押すとエラーが出てきます。ユーザー一覧やユーザー詳細を押したら問題なく表示されております。
この場合 show 周辺より new が怪しいでしょうか?

<div class="main user-show"> <div class="container"> <div class="user"> <h2><%= @user.name %></h2> <p> <%= @user.email %></p> <%= link_to("編集", "/users/#{@user.id}/edit") %> </div> </div> </div>
class UsersController < ApplicationController def index @users=User.all end def show @user=User.find_by(id: params[:id]) end def new @user=User.new end def create @user=User.new(name: params[:name], email: params[:email]) if @user.save redirect_to("/users/#{@user.id}") flash[:notice]="ユーザー登録が完了しました" else render("users/new") end end def edit @user=User.find_by(id: params[:id]) end def update @user=User.find_by(id: params[:id]) @user.name = params[:name ] @user.email= params[:email] if @user.save redirect_to("/users/#{@user.id}") flash[:notice]="ユーザー情報を編集しました" else render("users/edit") end end end
post "users/:id/update" => "users#update" get "users/:id/edit" => "users#edit" post "users/create" => "users#create" get "signup" => "users#new" get "users/index" => "users#index" get "users/:id" => "users#show"

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

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

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

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

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

guest

回答2

0

ベストアンサー

User.find_by(id: params[:id])が見つからない場合にnilを返すのが直接の問題です。

nilを返された時にどうするか決めていないのならば
@user = User.find(params[:id])で404エラーにしてしまった方がよいように思います。


params[:id]が見つからないのがそもそもの原因です。
なぜそのようなパラメータが渡されているのか、リンクを生成している側のviewを探る必要があります。


{"id"=>"signup"} 

なので、ルーティングがまずいですね。

routes.rbの上から設定されるので

rb

1get "/users/:id" => "users#show" 2get "/users/signup" => "users#new"

と設定すると/users/signupusers#showに引っかかりusers#newには飛びません。
先にnewにするか、そもそもresources :users, path_names: {new: :signup}使った方が楽です。

投稿2020/04/25 23:40

編集2020/04/26 00:20
asm

総合スコア15147

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

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

ke-si

2020/04/26 00:35

ルーティングは上から実行されるということでしょうか?一応newは上にしております、resources...は signup newのルーティングを消して書き換えるということでしょうか?
ke-si

2020/04/26 00:37

書き換えると新規登録は復活しました!が今度はユーザー一覧に同じエラーが出て 今度は{"id"=>"index"}となっております。
ke-si

2020/04/26 00:41

get "signup" => "users#new" → get "users/signup" => "users#new" に変えると復活できました。これはどういうことだったのでしょうか?
asm

2020/04/26 00:47

index/updateも標準とは違うので resources :users, path_names: {new: :signup, index: :index}, except: [:update, :destroy] do post "update" => "users#update", on: :member end ですね
asm

2020/04/26 00:50 編集

> "signup"→"users/signup" routes.rbでは/signupを利用しているのに 「新規登録のリンク」を生成しているViewファイルでは/users/signupをリンク先に指定していました。
ke-si

2020/04/26 00:55

そういうことでした、リンクの指定先を/users/signupにしてました。URLを確認すればすぐに分かることでした。適切な回答いただきありがとうございました。
guest

0

4行目の@user が定義されてないのでしょうか?

はい、@usernilとなっているようです。

showアクション内の@user=User.find_by(id: params[:id])は、見つからない場合にnilを返します。

投稿2020/04/25 23:40

maisumakun

総合スコア145208

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

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

ke-si

2020/04/26 00:25

回答ありがとうございます、idが入っていないということでしょうか?ユーザー詳細を見るとURLにid は含まれております。
maisumakun

2020/04/26 00:41

> idが入っていないということでしょうか?ユーザー詳細を見るとURLにid は含まれております。 当該IDが見つからない状態です。間違えて別なモデルのIDを供給していたりしませんか?
ke-si

2020/04/26 00:42

ありがとうございます、そういうケースもあるんですね、確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問