TweetにログインユーザーのIDが自動で入るようにする
formからログインユーザーのIDを入れたり、選択式にすることもできる。 もしくはhidden_fieldとcurrent_user.idを用いて擬似的に自動的にログインユーザーのIDをformで送ることもできるが、下記では違う方法を紹介。
ストロングパラメータではuser_idを受け取らないようにしている。
Tweet.new
した時点では@TweetTweet
にuser_id
はセットされない。
@tweet
のセッター@tweet.user_id=
を用いてcurrent_user.id
をセットすると、ログインしているユーザーのidを@tweet
にセットできる。
tweets_controller.rb
class Tweetscontroller < ApplicationController def create @tweet = Tweet.new(tweet_params) @tweet.user_id = current_user.id #セッターを用いてuse_idをセットする end end
user.rbにhas_many :tweets
があると、Userインスタンス.tweets.build
というメソッドが使える。これはUserインスタンスに紐付いたTweetインスタンスを生成する
メソッド。
つまり、newメソッドとbuildメソッドはともにインスタンスを生成するが、build
は自動的にuser_id
をセットしてインスタンスを生成することができる。
newの場合
@tweet = Tweet.new
user_id:
title:
content:
すべてが空のインスタンス
buildの場合
@tweet = @tweet.tweets.build
=> Tweet.new(user_id: @user.id)と同じ
user_id: 1
title:
content:
@userのidが入ったインスタンス
newメソッドの代わりにbuildメソッドを用いてuser_idがセットされるようにする。 以下の例ではcurrent_user.idが@tweetのuser_idとしてセットされている。またnewと同様にbuildにも引数として渡すことができる。 user_idが入ったインスタンスが生成できる。
tweets_controller
def create @tweet = Tweet.new(tweet_params) @tweet.user_id = current_user.id
以下のコードで書き換えられる。
def create @tweet = current_user.tweets.build(tweet_params)
※モデル間のアソシエーション、ストロングパラメータの設定も忘れずに。