🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails

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

Q&A

解決済

3回答

1091閲覧

undefined method `name=' for nil:NilClass というエラーが出てしまいます。

sn.jr

総合スコア53

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/10/19 02:35

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
プロフィールを編集して、名前、所属、画像をアップデートできるようにしたいのですが、エラーが出てしまい困っています。

イメージ
名前所属画像を変更したら、アップデート後に/users/indexに飛ぶ

拙い質問で申し訳ございません。何卒よろしくお願いします。

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

undefined method `name=' for nil:NilClass

該当のソースコード

Rails

1<div class="main users-edit"> 2 <div class="container"> 3 <div class="form-heading"> 4 プロフィール編集 5 </div> 6 <div class="form-body"> 7 <%= form_tag("/users/:id/update", {multipart: true}) do %> 8 <p>名前</p> 9 <input name="name" value="<%= @user.name %>"> 10 <p>所属パート</p> 11 <input name="part" value="<%= @user.part %>"> 12 <p>画像</p> 13 <input name="image" type="file"> 14 <input type="submit" value="保存"> 15 </div> 16 <% end %> 17 </div> 18</div>
def update @user = User.find_by(id: params[:id]) @user.name = params[:name] @user.part = params[:part] if params[:image] @user.image_name = "#{@user.id}.jpg" image = params[:image] File.binwrite("/public/user_images/#{@user.image_name}", image.read) end if @user.save flash[:notice]="プロフィールを変更しました" redirect_to("/users/#{@user.id}") else render("users/edit") end end

試したこと

エラーの出る、@user.name = params[:name]の部分を消したら一個下の@user.part = params[:part]でエラーが出ます。またこれも消したら@user.image_name = "#{@user.id}.jpg"で同じエラーが出ます。

https://teratail.com/questions/61224などを参考にしたところ、name,part,idを見つけれていないのかと思います。

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

Progateを参考に進めています

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

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

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

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

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

guest

回答3

0

フォームの飛び先に"/users/:id/update"と書いていますが、この表記では書いた通りに解釈されますので、updateでのparams[:id]には、「:id」が代入されてしまいます。当然ながら、こんなidのUserは見つかりませんので、@userがnilになります。

nilに対してプロパティの代入をしようとしているので、エラーになっています。

投稿2019/10/19 02:41

maisumakun

総合スコア145967

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

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

sn.jr

2019/10/22 06:26

ご回答ありがとうございます!なるほど、どのように書きかえればよろしいのでしょうか?もしありましたら教えていただけると幸いです!
siruku6

2019/10/22 08:09

せっかくベストアンサーにしていただいたので横やり失礼します... どうしても手っ取り早くやるなら、 <%= form_tag("/users/:id/update", {multipart: true}) do %> の部分を <%= form_tag("/users/" + @user.id.to_s + "/update", {multipart: true}) do %> のように修正する感じになります。 可能なら、コンソールで  bundle exec rake routes か、または bundle exec rails routes  (どちらもだめなら rake routes か rails routes) を実行して、updateアクションのpathを呼び出せるメソッド名を確かめるとよいと思います。 rake routesの結果をどう使ったらいいかわからない場合は、この質問かコメント欄に追記してみてください。
sn.jr

2019/10/22 09:34

ご親切にありがとうございます!! 少しやってみてわからなかったらまた質問させていただきます!
guest

0

@user = User.find_by(id: params[:id])


@user = nil
となっているので、nameやpartがないというのがエラーの原因かと。
params[:id]が取得できているか確認してみてください。

投稿2019/10/19 02:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sn.jr

2019/10/22 06:23

ご回答ありがとうございます!確認いたします!
guest

0

ベストアンサー

ここでuserを見つけられず、@userの中身がnilになっていることがエラーの原因です。

ruby

1@user = User.find_by(id: params[:id])

表示されているエラーは、nil.name= を呼ぼうとしたけど呼べなかったよ、というメッセージになります。

なので、

  1. params[:id] に、期待した値が入っているかどうか確認
  2. @user が正しく取得できているか確認

をしたらよいと思います

方法としては、以下のような記述をして、

ruby

1logger.debug(params) 2logger.debug(params[:id]) 3@user = User.find_by(id: params[:id])

実際に動作させて、log/development.log ファイルなどを確認するとよさそうです。


個人的には、 pry-rails と pry-byebug や better-errors という gem を使用して変数の中身を確かめるのがおすすめです。
余裕があれば、これらの導入方法も調べるとよいと思います

投稿2019/10/19 02:43

siruku6

総合スコア1382

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

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

sn.jr

2019/10/22 06:25

ご回答ありがとうございます!導入方法調べてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問