はじめに
※タイトルは少しオーバーになっていますがご了承ください!!
最近、Javaをずっと扱っていた私がRuby on railsをさわり始めました。
ある時、Javaっぽく書いているとエラーが発生して、違いに気づかされました。(最初は同じプログラミング言語だなーっていう感覚で完全に舐めてました・・・)
今回は、自分のメモという意味も込めて、投稿してみます(大部分の人が知ってそうな話題です)
Ruby on Railsのprivateメソッド
下記の記事を作成したり参照するコントローラーを作成しましたが、記事の詳細を開くときに@articlesがNilでエラーが発生しました(HTMLで@articlesを使っていて、そこでエラーが発生していました)
完全に自分の中では想定外でした
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と同じ感覚で進めていたのが原因かなぁと思ったりもしました
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