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

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

詳細はこちら
Ruby

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

Q&A

解決済

1回答

1120閲覧

NoMethodError in RelationshipsController#create

kawakun-----

総合スコア13

Ruby

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

0グッド

0クリップ

投稿2021/03/16 15:27

ユーザーのフォロー機能を実装しています。
フォローのボタンを押すとエラーになります。。。。。

エラー

undefined method `[]' for nil:NilClass def set_user @user = User.find(params[:relationship][:follow_id]) end end >> (params[:relationship][:follow_id]) NoMethodError: undefined method `[]' for nil:NilClass >> (params[:follow_id]) => "#<User::ActiveRecord_Relation:0x00007fea4b88ea18>" >> (params[:relationship]) => nil >>

relationshipコントローラー

class RelationshipsController < ApplicationController before_action :set_user, only: [:create, :destroy] def create following = current_user.follow(@user) if following.save flash[:success] = 'ユーザーをフォローしました' redirect_to @user else flash.now[:alert] = 'ユーザーのフォローに失敗しました' redirect_to @user end end def destroy following = current_user.unfollow(@user) if following.destroy flash[:success] = 'ユーザーのフォローを解除しました' redirect_to @user else flash.now[:alert] = 'ユーザーのフォロー解除に失敗しました' redirect_to @user end end private def set_user @user = User.find(params[:relationship][:follow_id]) end end

relationshipビュー

<% unless current_user == @users %> <% if current_user.following?(@users) %> <%= form_for(current_user.relationships.find_by(follow_id: @users), html: { method: :delete }) do |f| %> <%= hidden_field_tag :follow_id, @users %> <%= f.submit 'Unfollow', class: 'btn btn-danger btn-block' %> <% end %> <% else %> <%= form_for(current_user.relationships.build) do |f| %> <%= f.hidden_field :follow_id :follow_id, @users %> <%= f.submit 'Follow', class: 'btn btn-primary btn-block' %> <% end %> <% end %> <% end %>

paramsがrelationshipが空で
follow_idがアクティブレコードのエラーみたいですが、
原因がわかりません。。。。

どなたか助けてください。。。。。。。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/03/17 00:05

ずっと突っ込もうと思ってたのだけど、Railsのバージョンは5ですか? 質問者さんがお手本にされている情報が5での実装のはずなので、 もし6でやられている場合は5から6へ移行するために、 5では使われていたけど6だと使えない記述とかを直していく必要があるかと思います。 とりあえず、バージョン情報を質問に追記していただけますでしょうか。
退会済みユーザー

退会済みユーザー

2021/03/17 01:54

> バージョンは6です!! そこだっ!! 質問者さんが参考にしている情報は5で実装したものと記載されているので、 6にそのまま当てはめようとしてもどこかでエラーが出ると思う。 参考にされた元記事を6で作り直した情報とかピンポイントで見つけるのはたぶん難しいので、 「rails5の記事を元に6で実装しようとしている」ということを質問に追記するか、 Rails5を別に環境作って試してみるか、どちらかかなぁと。
guest

回答1

0

ベストアンサー

ずっと詰まってるみたいなので、君が参考にしている元記事のコメント欄も引っ張ってきたよっ
質問者さんは読み飛ばす癖があるのかもしれないと感じたので、

# 参考にしている記事のコメント欄までとりあえずみようぜっ

記事を参考にしてもエラー解決が出る方へ

  1. ・relationships_controllerのprivate以下の部分のdefの後にset_userを付け加えましょう!
  2. ・同じくrelationships_controllerのprivate以下の部分をparams[:follow_id]にしましょう!
  3. ・あとは最後に、同じくrelationships_controllerのredirect_toの後のパラメーターを自分が使っているpathに!

例えば、フォローとかをするViewのパスがusers_pathなら
Qiitaからの抜粋※コードは元記事のコメント欄を見ておくれ。そこまでパクると抜粋を超える。
※一連の流れが分からない人は質問者さんの過去の質問を順番にチェックしてねっ

バージョンの違いによって細かい仕様が変わってくるし、
ルーティングをどうつなげているかとか、
オブジェクトのパラメータに何をセットしているかとか、
君のファイルをすべて見たわけではないから僕らは分からないし、
たぶん全部貼られても全部を追うだけの時間がある人もそうそういないと思う。

君と同じように詰まった人が参考にしている元記事のコメント欄で質問を投げていて、
それに対する回答や他の人の考察とか付いてるから、その辺りも飛ばさずに読んでみようか。
コメントしている人たちが何を言ってるのか理解できたときにたぶん、動くようになる…はず。
※リストの1は僕に回答依頼した質問の答えになってたよね?2、3と追うと動くのかもしれない。
※人によってコードが違うから、なぜ違うのかを考えてみよう。どうして変えるのか、変えてもいいのか。

以下蛇足です。
最初の質問の解決方法を結局他の人にわかるように書き足していなかったり、
他の質問でも「元の記事に色々書いてありますよ」というようなアドバイスを貰っても、
コメント欄まで目を通してなかったり…(見てないよね?たぶん)
そのうち見限られちゃうかと。

上級者の人になるほど手取り足取りで1~10まで教えてくれなくなるから、
記事を参考にするなら一言一句漏らさずに、
記事の用語の理解とかも深めならが学習を進めた方が良いと思うよ。

投稿2021/03/17 00:27

編集2021/03/17 00:29
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kawakun-----

2021/03/18 06:55

ありがとうございます。 無事解決しました。 <% unless current_user == @user %> <% if current_user.following?(@user) %> <%= form_for(current_user.relationships.find_by(follow_id: @user.id), html: { method: :delete }) do |f| %> <%= f.hidden_field :follow_id, value: @user.id %> <%= f.submit 'いいね解除', class: 'btn btn-danger btn-block' %> <% end %> <% else %> <%= form_for(current_user.relationships.build) do |f| %> <%= f.hidden_field :follow_id, value: @user.id %> <%= f.submit 'いいね', class: 'btn btn-primary btn-block' %> <% end %> <% end %> <% end %> 原因としては、 f.hidden_fieldの@user.idがvalueで指定していなかったので 構文の記述がうまくできておらず、 引き継ぎができていなかったようです。。。
退会済みユーザー

退会済みユーザー

2021/03/18 09:26

おー、レベルアップ?おめでとうございます! これで安心してROMに戻れるw おいら何もしてないけどっ ほぼ自力で解決したみたいなもんだよね? 次からもこの調子でー…は違うか。 質問にバージョン情報を記載してRails6のタグも付けて、 分かる人に気づいてもらえるようにしよーっ! ではではっ
kawakun-----

2021/03/18 09:29

かしこまりました!! ありがとうございました!! また、機会があればよろしくお願いします!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問