Railsチュートリアル第11章でハマった箇所があったので、あとで見返すためにもメモを残しておきます。
ハマった箇所は、11.3.2 editアクションで有効化のところ。
エラー解消の結論としては、下記の義した名前を変更したことです。
config/routers.rbresources :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のコマンドラインに記載されたサーバーログは以下の通り。
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をコピペしてブラウザで開くと、例の赤い画面でエラーがおきています。
簡単に言えば、[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には気をつけましょう!