LoginSignup
1
0

More than 5 years have passed since last update.

RailsのPrivateメソッドはJavaと同じ感覚でいると痛い目に合う!

Last updated at Posted at 2018-12-31

はじめに

※タイトルは少しオーバーになっていますがご了承ください!!
最近、Javaをずっと扱っていた私がRuby on railsをさわり始めました。
ある時、Javaっぽく書いているとエラーが発生して、違いに気づかされました。(最初は同じプログラミング言語だなーっていう感覚で完全に舐めてました・・・)
今回は、自分のメモという意味も込めて、投稿してみます(大部分の人が知ってそうな話題です)

Ruby on Railsのprivateメソッド

下記の記事を作成したり参照するコントローラーを作成しましたが、記事の詳細を開くときに@articlesがNilでエラーが発生しました(HTMLで@articlesを使っていて、そこでエラーが発生していました)
完全に自分の中では想定外でした

articles_controller.rb
def index
  @articles = Article.paginate(page: params[:page], per_page: 5)
end

private
  def article_params
    params.require(:article).permit(:title, :description)
  end

def new
  // 省略
end

def create
  // 省略
end

def show
end
解決まで

単純ですが、リファレンスを見て解決しました

各コントローラの標準的なCRUDアクションは、多くの場合index、show、new、edit、create、update、destroyの順で配置されます。この順番でなくても構いませんが、これらがいずれもpublicメソッドである点にご注意ください。本ガイドで既に説明したように、コントローラのpublicメソッドはprivateより前に配置しなければなりません。

思いっきり載ってました・・・・
privateメソッドをpublicメソッドより後に記載しなおして、エラーは解決されました
privateを定義するとpublic等を明示しないと以降はprivateメソッドになるみたいです

原因

まぁ、リファレンスちゃんと見ていないのが悪いんですが、Javaと同じ感覚で進めていたのが原因かなぁと思ったりもしました

test.java
public void index() {
    //省略
}

private void set_article() {
    //省略
}

public void show() {
    //省略
}  

Javaでは上記の実装ではエラーが発生せず、set_article()以降がprivateメソッドにはなりません
メソッドそれぞれに修飾子を定義しているので、そりゃそうですよね

まとめ

今回のことで2つのことを学びました
①新しい言語を学ぶときはリファレンスを見よう!(とにかく検索)
②新しい言語を学ぶときは今までの固定概念を1回忘れたうえで、勉強していくうちに似た部分と違う部分を見つけていくようにしよう

あと、トライ&エラーは大切ですね

参照

Ruby on Railsガイド
https://railsguides.jp/getting_started.html

1
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
1
0