userのidメソッドが認識されていない話

 

問題

NoMethodError at /articles
undefined method `id' for nil:NilClass

が今回の問題である。user.idのidが何で認識されていないのかが焦点である。

関係するはずのファイルは以下の通りだ。

 

application_controller.rb

class ApplicationController < ActionController::Baseclass ApplicationController <  ActionController::Base before_action :set_current_user
 def set_current_user @current_user = User.find_by(id: session[:user_id])   end
end

 

articles_controller.rb

def create
 @article = Article.new(
  article_params,
  user_id: @current_user.id
 )

 respond_to do |format|
 if @article.save
  format.html { redirect_to @article, notice: 'Article was successfully created.' }
  format.json { render :show, status: :created, location: @article }
 else
  format.html { render :new }
  format.json { render json: @article.errors, status: :unprocessable_entity }
  end
 end
end

 Article.newを作るにあたり、user_idカラムに値を入れたいのだが、idが理解されずつまずいた。

 

やったこと1

そう言えばさっきuser_id作ったけど、どういう状況なのか見た所

f:id:kapiba-ra:20180526162118p:plain

いや、あんたUserモデルにuser_idカラム作ってるやないかーい。

そりゃarticleにuser_id入れられないわな。

とりあえず、userのuser_id消して、articleにuser_id足します。

f:id:kapiba-ra:20180526163250p:plain

でも解消されない。問題はそれだけではないようだ。

 

やったこと2

外で@user定義してやればいいんじゃねというお話。currtent_userをそもそも使わないで、sessionからやってみる。

def create
 @user = User.find_by(id: session[:user_id])
 @article = Article.new(
  article_params,
  user_id: @user.id
 )

 respond_to do |format|
  if @article.save
   format.html { redirect_to @article, notice: 'Article was successfully created.' }
   format.json { render :show, status: :created, location: @article }
  else
   format.html { render :new }
   format.json { render json: @article.errors, status: :unprocessable_entity }
  end
 end
end

 

 

でも相変わらずにidが何か認識されていないみたい。

 

やったこと3

Article.newの外側においておけば反応してくれるんじゃないかなという考え。

 

def create
 @article = Article.new(
 article_params,
)
 @article.user_id = @current_user.id

/ 以下略

 

直んねーwww

 

やったこと4

さっきからidが何か聞かれてるんだからidがわかる形になってないのかと思う。params使ってないよなそう言えば、、そこ直してみよう。

 

(コードはメモし忘れた)

 

でもできないそもそもparamsって、formで入力したデータか、リンクの:idとか取ってくるときしか使わないもんな関係ないよなあ

 

やったこと5

 

@current_userをcurrent_userにすれば良いのではないか。そして、article.newの外に持って来れば良いのではないか。

 

def create
 @article = Article.new(
  article_params
 )
 @article.user_id = current_user.id

/ 以下略

 

できた。やっとできた。

今回の問題になっていたことは

  • 違うテーブルにuser_idを追加していた。
  • @current_userという使い慣れないものを指定していた。
  • 個別でできるか試していないんだからまとめてやろうとしない。

っていうところですね。勉強になりました。

 

補足

 

そのあとで同様のエラーが違う工程で出たから、試しにidがnullのarticlesを全部消したら解決しました。こっちがそもそもの問題になっていた説もあるな。