文系エンジニア大学生の技術ブログ

主にエンジニア向けにITやプログラミングなどの技術系と大学生向けに休学、留学、海外生活、トビタテ留学、長期インターンに関する記事を書いています。

ruby on rails devise導入時のエラー対処法

<

f:id:daikiyano:20181013142403p:plain 今回はruby on rails のgemファイル deviseを導入した際に生じるエラーの対処法についてご紹介します。

deviseとは

deviseとはログイン機能などの認証機能の実装を簡単にしてくれる便利なgemファイルで、プログラミング初心者の方でも簡単に実装が出来てしまいます。 カスタマイズも可能なので、facebookやtwitterとの連携も可能となります。deviseを使ってtwitterなどと連携する方法も機会があれば手順書を書きたいと考えています。

  • gemファイルとは?

gemファイルとは簡単に説明するとruby用のライブラリです。1からコードを書かなくても既にライブラリが用意されているから認証機能の実装や画像投稿機能の実装を簡単にしてくれるよ!ていう便利なライブラリです。

私も一度PHPを学習している時にフレームワークなしでログイン機能の実装を1からやったのですが、複数のファイルに分けて長いコードを書かなければならないので、初心者の私は実装するのに数日かかりました。 しかし、railsのgemファイルdeviseを使用すれば、僅か数時間、慣れている方であれば数十分で簡単に認証機能の実装ができてしまいます。

今回は、deviseの導入方法ではなく、導入時に発生するエラーの対処法について記載していきますので、備忘録的な記事になります。 機会がある時にdeviseの実装手順について丁寧に紹介した記事を作成できればと考えております。

今回発生したエラー内容

  1. rails g devise:install  

  2. rails g devise User

deviseの導入手順通り進め、userのモデルを作成し、rake db:migrateをすると以下のエラーが表示される。

Mysql2::Error: Specified key was too long; max key length is 767 bytes

私の場合、My SQL文字コードの設定がutf8になっているが、utf8の場合1文字に対して4バイトとして扱われる。my sqlのデフォルトのstringの長さが255です。 つまり、255×4をすると1020バイトになる。先ほどのエラー内容は最大の長さは767バイトまでが限度なので、767以下に収まるように設定すれば良い。

対処法

  1. config/initializers内にmysqlpls.rbファイルを作成
  2. 以下のコードを記載。
require 'active_record/connection_adapters/abstract_mysql_adapter'

module ActiveRecord
  module ConnectionAdapters
    class AbstractMysqlAdapter
      NATIVE_DATABASE_TYPES[:string] = { :name => "varchar", :limit => 191 }
    end
  end
end


これで長さの設定の191に制限。つまり、191×4biteで764バイトになるので、エラーが表示されなくなります。

ちなみに下のようなエラーが出たらrailsを再起動してね。 devise導入後、再起動しないとエラーは解消されません。

f:id:daikiyano:20181013142403p:plain

以上で、devise導入時に発生するエラーの対処法についてのご紹介でした。