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作ったけど、どういう状況なのか見た所
いや、あんたUserモデルにuser_idカラム作ってるやないかーい。
そりゃarticleにuser_id入れられないわな。
とりあえず、userのuser_id消して、articleにuser_id足します。
でも解消されない。問題はそれだけではないようだ。
やったこと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を全部消したら解決しました。こっちがそもそもの問題になっていた説もあるな。