Ruby on Rails モデルのメソッドとコントローラー

 

 

 

タグ機能のときに参考記事をもとに記述したこちらのメソッド・・

書いた場所はItems Modelで呼び出しもItems Controller

 

さて先輩エンジニアの方から、

「タグの機能なのでタグのmodelで定義してみたらどうだろうか」

 

なるほど・・難しい・・・どうやるんだろ・・

というわけで、まるで理解が薄い自分のため整理したいと思います。

 

 

そもそも前提として、

処理を全てコントローラに書いちゃえば動くは動くのですが

コード量が増えてわかりづらい(ファットコントローラー)

 

 

こちらメソッド呼び出しのためのコントローラーの記述

@item.save_tag  save_tagがモデルに定義したメソッドを呼び出すための

インスタンスメソッド」である。

 

インスタンスとはクラス(設計図)から作られるものでありここでいう@itemがインスタンス、対してsave_tagメソッドがインスタンスメソッド)

 

https://qiita.com/leavescomic1/items/99f32f45cd04035f146c

 

メソッドを使い、細かい処理内容はModelさんのクラスで定義してしまおう

というお話。

 

 

<前提>

テーブル・アソシエーション(投稿とタグ 多対多、タグ中間で1対1)

 

では、ItemモデルからItemTagモデルへメソッドの大移動を行います。

 

 

 

モデルのクラスにインスタンスメソッドで定義を行う為

ItemTagのオブジェクトを作る必要がある

(これまではItemクラスの記述であったのでItemオブジェクトの作成でいけた)

 

こちらを追加。

ここで自分は、

え、params必要ないの・・・?

と疑問に感じましたが

 

ここでは空のオブジェクトを生成し

44行目で@itemと紐づいたItemTagを取得しtag_listsへ代入してる・・・?

ひとまずこちらで情報は取れていそう。

(ここは後日確認)

 

よし、あとはsave_tagメソッドをItemTagクラスへ定義して・・・と

はい、エラーでした。

 

 

「item_tags?item_idsじゃなくて・・・?」

と聞こえる・・・(見聞色)

 

 

やっぱりitem_tagsは見つかっていないみたい。

 

ちなみに変更前だとここでitem_tagsの中にitem_idがいた

Itemオブジェクトのインスタンスメソッドとして

Itemクラスで定義してたからそうか・・・

 

→というわけでおなじくitemの情報を取得する定義としてこちら

 

 

何かは入ってそう・・・

 

 

new_tagsに関しては取得できていた。

ただしすべて通過している様子。

"test"はItemTag(1)として存在しているのでこのままだと二重で生成してしまうことに。

 

 

 

ひとまず次に出たエラー

 

ここにもいたitem_tags・・・

 

ここではもともと新しく生成したタグをさらにitem_idと紐づけて連結させていた

ただ今回はitem_idと紐付けすることが難しそうなので一旦生成することに全集中。

 

 

 

エラー文を検索したところ、配列で返してと怒られているそう。

 

空の配列を用意してあげて代入。

返し値を指定してあげて・・・

 

通りました!!

 

ちょっと中身の確認。

 

すでに存在しているタグをなくし新規のタグのみ代入し返してしまっているみたい・・

 

 

やっぱりcurrent_tagsを取得しないと始まらなさそう。

 

ということで、

 

 

なんか惜しい・・・!

今回save_tagへ

"test"

"test3"

を送っており

最後に"test"も入れて送り返したい・・・