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

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

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

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

Q&A

2回答

1570閲覧

posts のカラム'user_id'を'@current_user.id'にしようとしたらundefined method `id' for nil:NilClassとなります

DaintyBlue

総合スコア0

Ruby on Rails

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

0グッド

0クリップ

投稿2020/06/06 02:08

編集2020/06/10 01:40

前提

Ruby on rails でProgateの練習で作るツイッターのようなアプリを模写して作っています。

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

postのuser_idカラムに@current_user.idをいれようと以下のコードを書いたのですが、新規投稿時にエラーになってしまいます。

ちなみに、ログインした後、すべてのページでログインしているユーザーのID番号が表示されているので@current_userがnilなはずないのですが...
初心者中の初心者でして、、お手数ですが教えていただけると幸いです。

エラーメッセージ↓
undefined method `id' for nil:NilClass

該当のソースコード

sessions_helper.rb

def log_in(user) session[:user_id]=user.id end def current_user @current_user = User.find_by(id: session[:user_id]) end

該当のソースコード

posts_controller.rb

def create @post=Post.new(post_params, user_id: @current_user.id) if @post.save flash[:notice]="Succecefully posted!!" redirect_to users_path else render :new end end

該当のソースコード

application.html.erb
こちらの@current_user.idはただしく表示されます。

<div class="home-menu"> <ul> <li><%= link_to "Create an account", new_user_path %></li> <li><%= link_to "login", login_path %></li> <% if logged_in?%> <li><%= link_to "Index", posts_path %></li> <li><%= link_to "New Post", new_post_path %></li> <li><%= link_to "Our Users", users_path %></li> <li><%= link_to @current_user.id, posts_path %></li> <li><%= link_to "logout", logout_path, method: :delete %></li> <%end%> </ul> </div>

該当のソースコード

application_controller.rb の冒頭

class ApplicationController < ActionController::Base include SessionsHelper end

該当のソースコード

posts_controller.rb の冒頭

class PostsController < ApplicationController before_action :logged_in_user, only:[:edit, :update, :destroy]

###sessions_helper.rb

module SessionsHelper def log_in(user) session[:user_id]=user.id end def current_user @current_user = User.find_by(id: session[:user_id]) end def current_user?(user) if session[:user_id] user == current_user end end def logged_in? !current_user.nil? end def log_out session.delete(:user_id) @current_user=nil end private def logged_in_user unless logged_in? redirect_to login_url end end end

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

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

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

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

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

guest

回答2

0

application.html.erb こちらの@current_user.idはただしく表示されます。

推測ですが、それはlogged_in?@current_userが定義されるので、それ以降の@current_userが動いているだけでは?

少しググってみましたが

rb

1def current_user 2 @current_user ||= User.find_by(id:session[:user_id]) 3end 4 5 6def logged_in? 7 current_user.present? 8end

のような使われ方をするメソッドのようなので、ここでcurrent_userが実行され、@current_userに代入が行われているのかなと思います。

つまり、 application.html.erb をレンダリングしないPostsController#createでは@current_userに代入が行われることがないので、タイトルのようなエラーが発生すると考えられます。

投稿2020/06/09 00:20

Mugheart

総合スコア2349

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

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

DaintyBlue

2020/06/09 09:42

すみません、、つまり定義の仕方をかえなければいけないのでしょうか??
Mugheart

2020/06/09 09:47

まぁ、修正の仕方は自由なんですが、一番手っ取り早いのは @current_user ではなく current_user を使うことですかね。 @post = Post.new(post_params, user_id: current_user.id)
DaintyBlue

2020/06/10 01:57

wrong number of arguments (given 2, expected 0..1)7 とエラーがでてしまいます。。ググってみたのですが、あまりわからず。。。
Mugheart

2020/06/10 01:58

@post = Post.new(**post_params, user_id: current_user.id) 展開してみてください。
DaintyBlue

2020/06/10 02:06

hash key "title" is not a Symbol すみません、そちらをコピペするとこのようなエラーになりました。 展開とは#{}をつけることとは違うのでしょうか?初心者で申し訳ないです、、
Mugheart

2020/06/10 02:10 編集

@post = Post.new(post_params.merge(user_id: current_user.id)) でどうでしょうか。 > 展開とは#{}をつけることとは違うのでしょうか? それは文字列内でのRuby式展開で、**{} はハッシュの展開、*[] は配列の展開です。
Mugheart

2020/06/10 02:12

> @post = Post.new(post_params.merge(user_id: current_user.id)) と思ったけど "title" が原因みたいなので post_params に原因がありそうな気がしますね。 エラー文を翻訳するなりしてちゃんと読んで実際のコードと照らし合わせればわかると思いますよ。
DaintyBlue

2020/06/10 02:13

できました!でもなぜかまったくわかっていないので、それは調べます。。ありがとうございます!!!
guest

0

新規投稿のcontroller で
@current_user が定義されていない

current_user が実行されていない

sessions_helper.rb が取り込まれていない
もしくは before_actionで呼ばれていない

のが原因でしょう

投稿2020/06/06 03:12

winterboum

総合スコア23524

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

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

DaintyBlue

2020/06/06 08:51

ご回答ありがとうございます!Application.controllerにて Include SessionsHelper として取り込んでいるのですが…それではだめなのでしょうか??
DaintyBlue

2020/06/06 08:53

それが取り込まれている証拠に、@current_user.idはすべてのページで表示されているので…
winterboum

2020/06/06 08:58

Application.controller、posts_controllerの頭の方載せてください
DaintyBlue

2020/06/06 14:39

のせました。お願いいたします。。。
winterboum

2020/06/06 23:17

logged_in_user はどこに有りますか?そのcodeを
DaintyBlue

2020/06/08 13:15

logged_in_userはsessions helperのところに記述してあります。。
DaintyBlue

2020/06/10 01:57

すみません、のせました。。
winterboum

2020/06/10 02:11

「質問の基本」に戻りましょう エラーメッセージ は省略しないで全部載せてください。 それに関わる view 、そのviewを呼び出すmethod そのviewが呼び出すactionのcodeがどれがどれであるかわかるようにして載せてください。
DaintyBlue

2020/06/10 02:20

もう一度読み直してみます!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.38%

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

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

質問する

関連した質問