Rails turorial 11章でおきたエラーを解消できるまでにやったこと

rails-logo プログラミング

Railsチュートリアル第11章でハマった箇所があったので、あとで見返すためにもメモを残しておきます。

ハマった箇所は、11.3.2 editアクションで有効化のところ。

エラー解消の結論としては、下記の義した名前を変更したことです。

config/routers.rb
resources :account_activation,only: [:edit]

resources :account_activations,only: [:edit]

[speech_bubble type=”ln” subtype=”R1″ icon=”yuta.png” name=”yuta”]些細なことではありますが、このエラーを解消するのに、約半日かかりました。。。
[/speech_bubble]

サクサクと10章まで進んでいたが、11章でつまづく

Railsチュートリアルをはじめて約2週間、各章の長さに心が折れかけるもなんとか10章までクリア。

11章に突入し、アカウントを有効化するeditアクションのところに差し掛かりました。

ソースコードは以下の通り。

リスト 11.31: アカウントを有効化するeditアクション
app/controllers/account_activations_controller.rb
class AccountActivationsController < ApplicationController


def edit
user = User.find_by(email: params[:email])
if user && !user.activated? && user.authenticated?(:activation, params[:id])
user.update_attribute(:activated, true)
user.update_attribute(:activated_at, Time.zone.now)
log_in user
flash[:success] = "Account activated!"
redirect_to user
else
flash[:danger] = "Invalid activation link"
redirect_to root_url
end
end
end

11.3.2 editアクションで有効化より引用

このコードを使うことで、新規にユーザーを作成した際に、サーバーログに表示されるアカウント有効化のメールに記載のURLが開くとAccountt activated!とflashで表示されるとのこと。

チュートリアルの手順に沿ってサーバーログのURLを開いてみる

cloud9のコマンドラインに記載されたサーバーログは以下の通り。

—-==_mimepart_597bd395ebdd9_221c227ca7033814
Content-Type: text/plain;
charset=UTF-8
Content-Transfer-Encoding: 7bit

Hi rtyu,

Welcome to the Sample App! Click on the link below to activate your account:

https:https://rails-tutorial-ymdom0920.c9users.io/account_activation/GAeb0WVL_2HDASRqrNGFQQ/edit?email=rtyu%40ed.com

そしてURLをコピペしてブラウザで開くと、例の赤い画面でエラーがおきています。
routing errorスクリーンショット

簡単に言えば、[speech_bubble type=”ln” subtype=”R1″ icon=”rails-logo.png” name=”railsさん”]AccountActionControllerなんて存在しないよ[/speech_bubble]って怒られているわけです。

ソースコードをいくら眺めても意味がわからないのでググってみた

[speech_bubble type=”ln” subtype=”R1″ icon=”yuta.png” name=”yuta”]正しくrailsチュートリアルのソースは書いているし、なんでだろう。。。[/speech_bubble]

と思い、グーグルで検索してみることに。検索してみると、スタックオーバーフローというQ&Aサイトで同じような質問をしている人が。

僕と同じく、Railsチュートリアル11章でつまづいていて、ソースコードを正しく記載しているのに、どうしてエラーがおきるのかわからないから誰か教えて!と質問しているようです。

それに対してある回答者はこんな返信を書いていました。

Change your file name from user_controller.rb to users_controller.rb

If you’re getting the error ActionView::MissingTemplate in Users#following Missing partial users/user then that’s exactly where you should look, views/users/_user.html.erb – do you have this file? Have you named it correctly? スタックオーバーフローより引用

めちゃくちゃ意訳すると、user_controller.rbっていうファイル名をusers_controller.rbにリネームしてみてね。ファイル名が本当に正しく名付けられているか確認してる?って言っています。

エラーの原因が判明したところで、改めて自分のフォルダを確認してみた結果!

[speech_bubble type=”ln” subtype=”R1″ icon=”yuta.png” name=”yuta”]なるほど、ソースコードが正しくても読み込むファイル名が違っていたらエラーが起きるのか[/speech_bubble]

と、感じましたね。(初心者丸出し)

そこで、自分のフォルダを一つ一つ検証してみると、自分も同じ間違いをしていることに気づきます。その箇所は、config/routes.rbでした。


Rails.application.routes.draw do
get 'sessions/new'

get 'users/new'

root 'static_pages#home'
get '/help', to:'static_pages#help'
get '/about', to:'static_pages#about'
get '/contact', to:'static_pages#contact'
get '/signup', to: 'users#new'
get 'login', to: 'sessions#new'
post 'login', to: 'sessions#create'
delete 'logout', to: 'sessions#destroy'
resources :users
resources :account_activation,only: [:edit]
end

[speech_bubble type=”ln” subtype=”R1″ icon=”yuta.png” name=”yuta”]あっ!account_activationが単数形になっている!
[/speech_bubble]

つまり、ControllerフォルダにあるAccountActivationsControllerに対して、ルーティングではaccount_activationとなっていて名前が違っていたことが原因でした。

これも初心者がつまづきやすいtypo(タイピングミス)です。

エンジニアとして改めて
[speech_bubble type=”ln” subtype=”R1″ icon=”yuta.png” name=”yuta”]タイピングは正確にしなきゃな[/speech_bubble]と思った日でした。

最後に

エラー解消には半日かかりましたが、rails testを実行してGreenになった瞬間はすごく嬉しく感じましたね。

今回の件で各章をしっかり熟読したおかげで第11章の理解が深まったことは大きな収穫でした!

このブログを読んでくれたあなたも、typoには気をつけましょう!