ihatov08 blog

プログラミング初心者だけどRailsとSwiftマスターします

TweetにログインユーザーのIDが自動で入るようにする

formからログインユーザーのIDを入れたり、選択式にすることもできる。 もしくはhidden_fieldとcurrent_user.idを用いて擬似的に自動的にログインユーザーのIDをformで送ることもできるが、下記では違う方法を紹介。

ストロングパラメータではuser_idを受け取らないようにしている。 Tweet.newした時点では@TweetTweetuser_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)

※モデル間のアソシエーション、ストロングパラメータの設定も忘れずに。