#selfとは。
備忘録も兼ねて記録を残そうと思います。
ここ2か月くらいselfってなんぞや?と思ってなんとなく
コードを記述していたのですが、ようやく全貌が見えてきました(笑)
(もっと早く理解をしろ!)← って話ですね。
まぁそんな難しい話ではないので、サクッと説明をしていきます。
##まずselfとは?
selfという言葉の意味から解説をできればと思います。
selfって英語でもあると思うのですが自分自身とは私達自身って時に
youself、myself、themselves...なんて使い方をしますよね
「自身」という風に考えるのがポイント!
##selfってどこでつかわれるの?
では、selfってどこで使われるの?って話になりますが
モデルのメソッドで書く時に使いますよ!
????
って感じだと思いますので、コードをみていきましょうか。
##selfの事例
では、コントローラーとモデルに記載をした例を
みていくとしましょう!
def create
@post = current_user.posts.new(post_params)
#:postはpostで投稿されてきた際にパラメーターとして飛ばされ、その中の[:tag_id]を取得して、splitで,区切りにしている
tags = params[:post][:tag_id].split(',')
if @post.save
#@postをつけることpostモデルの情報を.save_tagsに引き渡してメソッドを走らせることができる
@post.save_tags(tags)
redirect_to root_path, success: t('posts.create.create_success')
else
render :new
end
end
# タグ付けの新規投稿用メソッド
def save_tags(tags)
tags.each do |new_tags|
# selfは明示的に記載していてこの場合だとコントローラーの@postになる
# tag_relationshipsがthroughしているのでtagsでアソシエーションを指定すると中間テーブルを通過した際に保存される。
self.tags.find_or_create_by(name: new_tags)
end
end
まずはコントローラーのこちらに注目です。
@post.save_tags(tags)
この@postにはPost.find(params[:id])で
ある特定のpostの情報が入っています。
そして、.save_tags(tags)はメソッドです。
メソッドがなにかというと、
自分で作れる処理のまとまりのことです。
つまり自作した処理のコードをモデルに書いて
それをコントローラー側で呼び出すことができます。
こうすることでコントローラーの記述が
スッキリして見やすくなるのでリーダブルコードになりますよ!
次にモデルの中のメソッドの記述をみていきます。
どこでselfが使われているかというと下のココという箇所。
def save_tags(tags)
tags.each do |new_tags|
# selfは明示的に記載していてこの場合だとコントローラーの@postになる
# tag_relationshipsがthroughしているのでtagsでアソシエーションを指定すると中間テーブルを通過した際に保存される。
ココ ⇒ self.tags.find_or_create_by(name: new_tags)
end
end
このselfっていったいなんぞや?ということですが
実はコントローラー側で@post.save_tags(tags)と
インスタンス変数を記載しましたよね?
モデルにメソッドを書く時に@postと書かなくても
モデルには@postの情報をselfと書くことで
Post.find(params[:id)を引き渡せるんですね。
つまりselfというのは、@post = Post.findなので
@post = self = Postモデルということになります。
インスタンス変数にPost findと書いているので
Postモデルに記載をすることでpost自身だからselfと
いう風な書き方をすることができます。
ちなみにselfは書いても書かなくてもいいのですが
書いた方がpostモデルの情報を引き継いでいるんだな!と
見やすく分かりやすくなるので書いた方が親切です。
selfがなくても、処理自体はコントローラーで
@post.save_tagsと書いているので@postの情報を
引き継いだままsave_tagsメソッドを走らせることはできます。
##selfのまとめ
以上でselfの解説を終わりにしようと思います。
いかがでしたでしょうか?
selfをもう一度まとめると。
・自分自身という意味
・コントローラーで指定したモデル名とメソッドを各モデルが一致していたらselfが使える
・一致していない場合は、selfは使えずモデル名の指定が必要
それでは、簡単に説明しましたがいかがでしたでしょうか?
もし誤りなどがあれば気軽にコメントくださいね!
それではチャオ!