高卒クズ男の再興戦略

高卒クズ男こと堀川登喜矢がエンジニア転職を皮切りにクズ脱却を目指すブログです。

Rails初学者が「privateやparamsが分かんない」って時に見るコラム

:目次

1.privateってなに??
2.paramsってなに??
3.params.permit(:image, :text)ってなに??
4.redirect_toってなに??
5.action: :indexってなに??
6.unless unless user_signed_in?ってなに??


突然ですが問題です。
Ruby on Railsのコントローラーでこの様な記述がありました。

「では解説してみてください。」
class TestsController < ApplicationController
  before_action :move_to_index, except: :index 

  // 省略します  

  private

  def tests_params
    params.permit(:image, :text)
  end

  def move_to_index
     redirect_to action: :index unless user_signed_in?
  end

end

...できましたか?

もしできなければ以下を読んで大まかな捉え方を覚えましょう!多くの知識はどこかで繋がっているので知識の捉え方を覚えて仕舞えば今後の理解がサクサク進みます!

1. privateってなに??

これはprivateメソッドと言います。その名の通りプライベートなメソッドなのでprivate以下に書き込まれたメソッドはclassの中だけでしか呼び出せません。

どんな時に使うの?

はい、すごくよく使う場面は2点!

  • paramsを取得する時
  • before_actionする時

2. paramsってなに??

paramsはURLから送られて来た値やフォームから送られて来た値のパラメーターのことです!つまりブラウザを一度通して送られて来た値とも取れますね!

そしてprivate以下で記入されているということはclassの外で呼び出されて欲しくないものになります!

http://railsdoc.com/references/params

3. params.permit(:image, :text)ってなに??

def tests_params
  params.permit(:image, :text)
end

paramsの中からimagetextを取り出そうとしています。しかし、paramsとは外部から送られてくる値ですのでもしかしたら悪意を持った人がハッキングを仕掛けてくるかもしれません!

...と、そこまでではありませんがpermitを指定することで特定の値のみを取り出すことができます。

さらに!paramsに入った値は配列[ ]やハッシュ{ }に格納されるため:imageなどの様に:を先頭に付けることで取り出せます!٩( ᐛ )و

4. redirect_toってなに??

指定されたページへ飛ばすことができます!
基本的にはURLやPrefix(Path)を指定して飛ばしますが..

なんとRailsではaction指定で飛ばすことができるのです!!٩( ᐛ )و

http://railsdoc.com/references/redirect_to:rmbed

5. action: :indexってなに??

redirect_to action: :index

actionはコントローラのアクションです!
今回は同じコントローラ内のindexアクションを指定しているみたいですね!

ちなみに:を付けるか否かの思え方としてはaction:action =と考えるとイメージが近いと思います!

そして:indexはデータを探っていくと配列[ ]の中に入っていたのでこの形になっています!

6. unless user_signed_in?ってなに??

unlessとは「○○では無い」の条件分岐です!

redirect_to action: :index unless user_signed_in?

if文でごちゃごちゃ書くのが面倒なのでできたものですかね?きっとこのメソッドを作った人とは気が合いそうだ!٩( ᐛ )و

user_signed_in?とはかの有名なユーザー管理gemのdeviseさんが用意してくれているメソッドです!

文字の通りユーザーはログインしているかどうかを確認できます!もちろんログインしていればtrueで未ログインならfalseを返します。

そしてここでお得情報!
user_signed_in?deviseさえ入れればコントローラーでもビューでもどこでも使えちゃいます!