3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【rails】 selfとはなにか?を解説しようと思う。

Posted at

#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は使えずモデル名の指定が必要

それでは、簡単に説明しましたがいかがでしたでしょうか?

もし誤りなどがあれば気軽にコメントくださいね!

それではチャオ!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?