ihatov08 blog

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

buildはすごく便利

例えばtweetするときに、tweetしたuserと関連付けたい。 まずはtweetモデルにuser_idカラムを追加して、どのuserの投稿か判別するようにする。 さらに、モデル間のアソシエーションをする。 tweetを投稿するviewのformからuser_idを選択もしくは、hidden_fieldにして自由に変更できないようにして、隠れてuser_idを関連付けて関連づける方法もある。 一番よい方法はbuildを使うこと。 buildを使うときの注意点。まず、user_idをform から送る必要がないので、ストロングパラメータのpermitからuser_idカラムを削除してしまう。

def tweet_params
 params.require(:tweet).permit(:content, :user_id)
#このuser_idを削除してしまう
end

createアクションで@tweetのセッターを用いてcurrent_user.idをセットすると、ログインしているユーザーのidを@tweetにセットできる。(current_userヘルパーは自分で定義するかdeviseを使用している場合はデフォルトで定義されている)

def create
@tweet = Tweet.new(tweet_params)
@tweet.user_id= currnt_user.id
#セッターを用いてuser_idをセット
end

モデル間のアソシエーションをしている場合はUserインスタンス.tweets.buildというメソッドが使える。 これはUserインスタンスに紐付いたTweetインスタンスを生成するメソッド。 つまりnewメソッドとbuildメソッドはともにインスタンスを生成するが、buildは自動的にuser_idをセットしてインスタンスを生成することができる。

@tweet = @user.notes.build
#Tweet.new(user_id: @user.id)と同じ

以下の例ではcurrent_user.idが@tweetのuser_idとしてセットされている。

def create
 @tweet = Tweet.new(tweet_params)
 @tweet.user_id=current_user.id
end
@tweet = current_user.tweets.build(tweet_params)