こんにちは、おーしまです。
今回は、記事と複数個のタグをformオブジェクトパターンで保存する方法を説明します。
ちなみに、formオブジェクトパターンを使うと、最初の保存までは簡単ですが、編集、更新がむずいので、初心者は気をつけてください。
【編集、削除機能はこちら】
https://tomo-bb-aki0117115.hatenablog.com/entry/2020/10/31/005817
それでは行きましょう。。
コントローラー
def new @form = SaveCarsTag.new end def create @form = SaveCarsTag.new(car_params) tag_list = params[:save_cars_tag][:name].split(",") if @form.valid? @form.save(tag_list) return redirect_to root_path else render :new end end
モデル
class SaveCarsTag include ActiveModel::Model attr_accessor :title, :image, :text, :maker_id, :car_name, :body_type_id, :name, :user_id with_options presence: true do validates :title, length:{maximum: 40} validates :text end def save(tag_list) car = Car.create(title: title, image: image, text: text, maker_id: maker_id, car_name: car_name, body_type_id: body_type_id, user_id: user_id) tag_list.each do |tag_name| tag = Tag.where(name: tag_name).first_or_initialize tag.save CarTag.create(car_id: car.id, tag_id: tag.id) end end end
こんな感じで、できました。
複数個のタグの保存部分だけ、詳しく説明します。
まず、タグを複数個つける場合は、「かっこいい,すごい,イケてる」のように , で区切ってフォームに記述してもらいます。
それを、createアクションで、、
tag_list = params[:save_cars_tag][:name].split(",")
splitメソッドを用いて , で区切って、配列に変換しています。つまり["かっこいい","すごい","イケてる"]となり、3種類のタグで保存できるようになります。
それをformオブジェクトのモデルにsave(tag_list)で運んでいます。
def save(tag_list) car = Car.create(title: title, image: image, text: text, maker_id: maker_id, car_name: car_name, body_type_id: body_type_id, user_id: user_id) tag_list.each do |tag_name| tag = Tag.where(name: tag_name).first_or_initialize tag.save CarTag.create(car_id: car.id, tag_id: tag.id) end end
ここに運ばれました。
まずはcarsテーブルの値を保存して、それをcarに入れています。
次に、配列で運ばれてきたtag_listをeachメソッドを使って、一つずつ取り出し、whereメソッドとfirst_or_initializeメソッドで今までに保存したことがないタグだけ保存しています。
すでにテーブルに存在していた時は、その値を返すので、中間テーブルにcar.idとtag.idを保存すれば、紐づけることができます。
ここまではネットで調べれば、すんなりできましたが、編集と更新がもう意味わからないです。明日、tech-campのメンターに聞いてみます。
今回はここまでです。
それではまた〜