Web Marina

日々の業務や勉強などで得た知識をアウトプットしていきます。

9章のrememberメソッドが動かずハマった。

9章に入ってremember me機能の追加について学んでいますが、なかなか理解が及ばず難航しております。 今回は1.1の演習でだいぶハマったので書き留めておきます。

概要

演習1のrememberメソッドの動作確認を行おうとしたところ、NoMethodErrorが出てしまった。

対処

NoMethodError: undefined method `remember_token' forを調べてみた

そのまんまですが、これでググってみたところ

Undefined method `remember_token=' 'find_by_remember_token' - Chapter 8 Ruby on Rails Tutorial - Stack Overflow

というのが見つかったので$rails db:resetしました。

SQLite3::BusyException: database is locked:

登録したユーザーが消えてしまったので、ブラウザから再登録を試みたところ、今度はこんなのが出てきました。

いろいろ調べてデータベースロックやdatabase.ymlのtimeoutの値を変更するとか、 ActiveRecord::Base.connection.execute("BEGIN TRANSACTION; END;") をコンソールで実行するとか出てきましたが、私の場合はもう一つのターミナルでコンソールが動いたままだったのが原因のようです。 rails consoleを終了したところ無事ユーザー登録できました。

ちみに他の解決法が書いてあったのはこちらの記事です。

Ruby: SQLite3::BusyException: database is locked: - Stack Overflow

これで無事rememberメソッドが動くようになりました。

おまけ

今回特にテストは追加していなかったので意味はあまりないとは思いましたが、一応やってみたところ何か引っかかってしまいました。

rails aborted!
ActiveRecord::NoEnvironmentInSchemaError:

私はSchemaErrorというところで「なんかDB系がおかしいのか?」と勝手に判断して$rails db:resetとかしましたが、後ほど調べたらRails5から導入された本番環境で間違ってデータベース破壊するような命令しちゃった時の予防策のようです。 こちらで詳しく説明してくださっています。

Rails 5に入ったDB破壊系taskの防止処理について | 日々雑記

そういえばエラーメッセージの最後に「テスト環境で実行しなさいよ」って言われてたかも・・・

当たり前ですが、エラーメッセージはちゃんと読まなきゃダメですね。

今更ながらRailsをアップデートしました。

Tutorial7章終わりまで来て今更Rails5にアップデードしたお話です。

みなさん明けましておめでとうございます。

年末に「はじめました」記事を書きましたが、この度Rails Tutorialの第7章が終了したので本格的に始めることにしました。

記念すべき(実質)最初の記事は、これまでRails TutorialをRails4.2で学習していたところ、第7章「プロのデプロイ」でPumaを導入するにあたりRailsを5.0.1にアップデートしたお話です。

と言ってもさっさと勉強進めたかったのでだいぶ強引にアップデートしたので実践的ではないと思いがよろしくお願いします。

バージョンアップの仕方

まずは当然作成中のディレクトリのままのバージョンアップを試みました。がしかし、そもそもPCにRails5はもちろんRuby2.2.2も入っていなかったです・・・

ということでそれらをインストールし、スマートなやり方ではないと思いましたが、rails5用のディレクトリを作成してこれまでのファイルをそこにコピーすることにしました。

(元を変えて失敗したら怖かったので・・・)

それぞれのインストールにはこちらを参考にさせて頂きました。

http://qiita.com/gaku3601/items/5a484043f9c803ce9941

変更点

アプリのコードは変更というよりほとんど教材通りに直しただけです。 (Rails5前提で書かれてるのだから当たり前ですけど…)

<変えた部分>

  1. Gemfile.lock。ここは丸ごと消してやり直しました。
  2. Gemfile。ここもチュートリアルのやつを丸ごとコピペしました。 (ちなみに7章までの最終版のGemfileは、この章のリスト6.36が最後です。 https://railstutorial.jp/chapters/modeling_users?version=5.0#cha-modeling_users)
  3. 前に自分で勝手に消したparamsを教材通りに戻す。
  4. ActiveRecord::Baseを継承している部分をApplicationRecordにする。
  5. テストでDEPRECTION WARNINGが3つほど出たので警告に従い対処。

詳細

1. Gemfile.lock

Rails5導入に伴い、インストールしているgemもアプデートしなくてはならないのですが、こいつがあるとうまくいきません。 なので一度削除することにしました。

2. Gemfile

最新版とかは今のところ必要ないので、これはチュートリアルのものを丸々コピペしてbundle install。 これでGemfile.lockも新しく作り直されました。

3. 自分で消したparams

これは以前Rails4.2の時にparamsハッシュを使おうとしたところ、params:{ }を省略しないと正常に動作しなかったため削除したのですが、Rails5からは明示的に記述するのが推奨されているとのことでしたので戻しました。

ちなみに削除した経緯の詳細はこちらです。

http://qiita.com/maru_katy/items/76eebf872c3d927abbd8

4. ApplicationRecord

Rails4.2以前はActiveRecord::Baseから継承されていたものが、Rails5からはApplicationRecordに移されたとのことです。

<手順>

  1. app/modelsにapplication_record.rbファイルを作成。 次を記述
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end
  1. ソース内のActiveRecord::Baseの部分をApplicationRecordに修正。 これはこちらを参考にさせていただきました。 https://railsguides.jp/upgrading_ruby_on_rails.html http://qiita.com/ryohashimoto/items/09724ad4dddcda01bce3

5. テストで出るDEPRECTION WARNING

具体的にはconfig/environments/test.rbファイルで2つ。 config.serve_static_files -> config.public_file_server.enabled = true config.static_cache_control = ‘public, max-age=3600’ ->config.public_file_server.headers = { ‘Cache-Control’ => ‘public, max-age=3600’ }

もう一つはアプリのソース外です。 これは4.2からだそうですが、隠しディレクトリの.rbenv以下のファイルにある raise_in_transactional_callbacks=(value) の設定をtrueにしました。

これらの詳しい説明はRailsのアップグレードガイドをご覧ください。

https://railsguides.jp/upgrading_ruby_on_rails.html

まとめ

まず、Markdownの書き方や文章に慣れてなくてすみません。 もう少し読みやすい文章や書き方も勉強します。

今回のやり方は正攻法ではないとは思いますが、自ら調べて何とかうまくいったことは無駄ではなかったと信じています 笑

これからどんどん勉強や情報収集をして、どこかでどなたかのお力になれる記事が書けるように精進してまいりますので、どうぞよろしくお願いいたします。

最後に、3日坊主にならないことを祈ります・・・ 笑

はじめました(≧∀≦)

千葉で子育ての傍らプログラミングの勉強をしています。

 

将来的に自分のWebサービスを作ることをまずは目標に、現在はRails TutorialでRuby on Railsを勉強中です。

 

来年の目標は「一つアプリを作る!」

年明けから始められるようブログ開設しました。

よろしくお願いします!