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

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

詳細はこちら
Ruby

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

Ruby on Rails

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

Q&A

解決済

3回答

3619閲覧

Railsでundefined method `[]' for nil:NilClass

bok_sakai

総合スコア20

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/10/28 05:26

編集2019/10/28 05:30

前提・実現したいこと

Rails6でツイートアプリを作っている者です。

ユーザー同士のフォロー機能を導入している時にハマってしまいました。

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

Ruby

1NoMethodError in RelationshipsController#create 2undefined method `[]' for nil:NilClass

該当のソースコード

Ruby

1class RelationshipsController < ApplicationController 2 3 before_action :set_user 4 5 def create 6 @user = User.find(params[:relationship][:follow_id]) 7 following = current_user.follow(user) 8 if following.save 9 flash[:success] = 'ユーザーをフォローしました' 10 redirect_to user 11 else 12 flash.now[:alert] = 'ユーザーのフォローに失敗しました' 13 redirect_to user 14 end 15 end 16 17 def destroy 18 @user = User.find(params[:relationship][:follow_id]) 19 following = current_user.unfollow(user) 20 if following.destroy 21 flash[:success] = 'ユーザーのフォローを解除しました' 22 redirect_to user 23 else 24 flash.now[:alert] = 'ユーザーのフォロー解除に失敗しました' 25 redirect_to user 26 end 27 end 28 29 private 30 31 def set_user 32 @user = User.find(params[:relationship][:follow_id]) #←エラーが出る行 33 end 34end

エラーメッセージで検索してもそれらしいページはヒットせず、対応の仕方がわからず困っています。
ご教授お願いいたします。足りない情報などございましたらお手数ですがコメントでおしらせください。

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

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

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

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

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

guest

回答3

0

ベストアンサー

そのリンク先の記事を少し読みましたが、該当と思われるフォームが

erb

1<%= form_for(current_user.relationships.find_by(follow_id: user.id), html: { method: :delete }) do |f| %> 2 <%= hidden_field_tag :follow_id, user.id %> 3 <%= f.submit 'Unfollow', class: 'btn btn-danger btn-block' %> 4<% end %>

こんな感じで書かれているのでparams[:relationship]nilです。
ただコピペするんじゃなくて、コードの意味や実行結果を確認しながら写経したほうがいいですよ。

修正するポイントはparams[:relationship][:follow_id]の部分か、
もしくはform_for ... endのフォーム部分どちらか一方でいいです。
フォームから送信される値を受け取れるようなparamas[:key]の書き方にするか
params[:relationship][:follow_id]に値を送信できるよなフォームにするかってことです。

投稿2019/10/28 06:56

Mugheart

総合スコア2349

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

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

Mugheart

2019/10/28 07:06

とりあえず記事の方には修正リクエストを投げておいた
bok_sakai

2019/10/28 07:26

ありがとうございます。 落とし穴に気づけませんでした。肝に命じます。 form_forをparams[:relationship][:follow_id]に値を送信できるよなフォームにするにはどのようなコードにするのが一番正しいでしょうか。@relationshipをつけたりしてみたのですがどれも上手くいきませんでした、、。
Mugheart

2019/10/28 07:39

英語にはなりますが参考になるリンクを貼っておきます。 https://apidock.com/rails/ActionView/Helpers/FormHelper/form_for 英語が読めなくてもGoogle翻訳を通せばある程度理解できると思います。 盲目的にコピペをされている印象を受けたのでできれば自力で解決して欲しいところです。 どうしてもわからないのであれば、記事内の同じフォームを書いているhamlのコードが params[:relationship][:follow_id]に値を送信できるような正しいフォームになっています。 もう一度言いますが、できればURLを貼ったドキュメントを参考に自力で解決してください。
bok_sakai

2019/10/28 07:46

できる限り複数のサイトを見比べながら、自分の正しいと思うコードを参考に導入していたのですが、力不足でした。 ご丁寧にありがとうございます。お気にかけていただいた分、きちんとリンク先で学ぼうと思います。もし理解できなければ再度質問させていただくかもしれません、その時はよろしくお願いいたします。
bok_sakai

2019/10/29 16:38

リンク先の内容、難しいところもあり全てではありませんが、大枠は理解できました! valueを指定する必要があったのですね、勉強になりましたm(_ _)m
guest

0

params[:relationship][:follow_id]

実際にどういうデータが入っているか不明ですが、params[:relationship]がデータが無ければNilとなり、Nilオブジェクトに対して[:follow_id]でアクセスしようとしているのでご提示のエラーとなると思います。

投稿2019/10/28 05:42

kazto

総合スコア7196

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

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

kazto

2019/10/28 05:58

当該の記事の正当性が分かりませんが、少なくともコードだけから判断して、Nilになりえる箇所は上記のとおりです。
bok_sakai

2019/10/28 07:00

上記とは、どの部分のことでしょうか。 理解力不足なもので、申し訳ありません。
kazto

2019/10/28 07:47

params[:relationship][:follow_id] の部分です。
guest

0

そのエラーの出ている行、あるいはその前の行の変数をチェックしてみてください。
nilになってませんか。

投稿2019/10/28 05:40

y_waiwai

総合スコア88038

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

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

y_waiwai

2019/10/28 06:03

なり得る箇所を探すんではなく、エラーの出てる行の変数をプリントアウトするなりして内容をチェックしましょう あるいはRubyをデバッグできる環境を揃えましょう。 そうすれば、当てずっぽでコードを書かなくても済みますよ 「ruby デバッグ」でぐぐるとやり方出てきますね
bok_sakai

2019/10/28 07:01

デバッグですか、ありがとうございます。 早速調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問