おーしまブログ

プログラミングやってます

<rails>formオブジェクトパターンで、タグ付け機能を実装

こんにちは、おーしまです。

今回は、記事と複数個のタグを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のメンターに聞いてみます。


今回はここまでです。
それではまた〜

ここはどこ おれはだれ それに近いものがあんだよ 始めようとした奴らも迷い始めてる 怖がらせないでよ そりゃ甘くはないけど まだまだ 夢見ていい世界なんでしょ {UVERwould「ハイ!問題作」}