質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.71%

[Rails] [Devise] サインアップ時に発生するエラー”undefined method `username'”を解決したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,640

tacro

score 17

前提・実現したいこと

Rails5で開発をしています。
一通り実装が終わってから、deviseの存在を知り、ログイン周りの機能を実装し直しています。
すでにuserモデルが存在しているので、別途memberモデルをdeviseで作成し、userモデルの役割を移行しようと試みています。
以下の記事を参考にしています。
Rails deviseによるユーザー認証 メールによる認証、emailとusernameのどちらでもログイン可能にするまで

発生している問題

サインアップを実際に行えるか試してみたところ、フォームを送信する過程で以下のエラーが発生しました。 
なんとかして解決したいです、アドバイスお願い致します!

NoMethodError in Devise::RegistrationsController#create
undefined method `username' for #<Member:0x00007fa4496a25d0> Did you mean? rename

細かなエラーメッセージは以下の通りです。 →【追記】本文の字数が足りないため、一旦省略します。

schema.rbやdbconsoleから、memberテーブルを確認してみましたが、usernameカラムはきちんと存在しています。

ActiveRecord::Schema.define(version: 20180330025634) do
...
  create_table "members", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer "sign_in_count", default: 0, null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string "current_sign_in_ip"
    t.string "last_sign_in_ip"
    t.string "confirmation_token"
    t.datetime "confirmed_at"
    t.datetime "confirmation_sent_at"
    t.string "unconfirmed_email"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "username"
    t.integer "user_group"
    t.string "icon_image_name"
    t.integer "gender"
    t.string "profile"
    t.index ["email"], name: "index_members_on_email", unique: true
    t.index ["reset_password_token"], name: "index_members_on_reset_password_token", unique: true
    t.index ["username"], name: "index_members_on_username", unique: true
  end
...
end

該当のソースコード

その他、コントローラでのパラメータの設定は以下の通りです。

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :authenticate_member!

  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up) do |member_params|
      member_params.permit(:username, :email, :password, :password_confirmation, :gender, :user_group, :remember_me)
    end
    devise_parameter_sanitizer.permit(:sign_in) do |member_params|
      member_params.permit(:login, :username, :email, :password, :remember_me)
    end
    devise_parameter_sanitizer.permit(:account_update)  do |member_params|
      member_params.permit(:username, :email, :password, :password_confirmation, :current_password)
    end
  end
...
end

試してみたこと

rake db:migrate:resetでデータベースのリセットを行ったりしてみましたが、解決しませんでした。

使用している環境

Ruby on Rails 5 devise (4.4.3)

追記

Rails.application.routes.draw do
  devise_for :members
  root "home#top"

 # get 'signup' => "users#new"
  # get 'login' => "users#login_form"
  # post 'login' => "users#login"
  # post 'logout' => "users#logout"
  # get 'users/:id/signup_designer' => "users#new_designer"
  # patch 'users/:id/register_designer' => "users#register_designer"
  #
  # post 'users/create' => "users#create"
  # get 'users/:id' => "users#show"
  # get 'users/:id/edit' => "users#edit"
  # patch 'users/:id/update' => "users#update"
  # patch "users/:id/update_designer" => "users#update_designer"
  # get 'users/:id/likes' => "users#likes"
  # get 'users/:id/timeline' => "users#following_posts"

  get 'posts/index'=> "posts#index"
  get 'posts/new' => "posts#new"
  post 'posts/create' => "posts#create"
  post "posts/:id/comment" => "posts#comment"

  post "comments/:id/destroy" => "comments#destroy"

  get 'posts/:id' => "posts#show"
  get 'posts/:id/edit' => "posts#edit"
  patch 'posts/:id/update' => "posts#update"
  post 'posts/:id/destroy' => "posts#destroy"

  post '/likes/:post_id/create' => "likes#create"
  post '/likes/:post_id/destroy' => "likes#destroy"

  get '/' => "home#top"
  get "about" => "home#about"

  resources :users do
    member do
     get :following, :followers
    end
  end
  resources :relationships,  only: [:create, :destroy]

  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
class Member
  include Mongoid::Document
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  attr_accessor :login
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :confirmable, :authentication_keys => [:login]

  validates :username,
            uniqueness: { case_sensitive: :false },
            length: { minimum: 4, maximum: 20 },
            format: { with: /\A[a-z0-9]+\z/, message: "ユーザー名は半角英数字です"}


  ## Database authenticatable
  field :email,              type: String, default: ""
  field :encrypted_password, type: String, default: ""

  ## Recoverable
  field :reset_password_token,   type: String
  field :reset_password_sent_at, type: Time

  ## Rememberable
  field :remember_created_at, type: Time

  ## Trackable
  field :sign_in_count,      type: Integer, default: 0
  field :current_sign_in_at, type: Time
  field :last_sign_in_at,    type: Time
  field :current_sign_in_ip, type: String
  field :last_sign_in_ip,    type: String

  ## Confirmable
  field :confirmation_token,   type: String
  field :confirmed_at,         type: Time
  field :confirmation_sent_at, type: Time
  field :unconfirmed_email,    type: String # Only if using reconfirmable

  ## Lockable
  # field :failed_attempts, type: Integer, default: 0 # Only if lock strategy is :failed_attempts
  # field :unlock_token,    type: String # Only if unlock strategy is :email or :both
  # field :locked_at,       type: Time

  def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
      where(conditions).where(["username = :value OR lower(email) = lower(:value)", { :value => login }]).first
    else
      where(conditions).first
    end
  end

  def will_save_change_to_email?
  end

end
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • KaiShoya

    2018/03/30 13:31

    routes.rbの中を見せて下さい

    キャンセル

  • tacro

    2018/03/30 13:39

    追記致しました!よろしくお願いします。

    キャンセル

  • Hungmi

    2018/03/30 14:27

    member.rbの中を見せて下さい

    キャンセル

  • tacro

    2018/03/30 14:29

    追記致しました!よろしくお願いします。

    キャンセル

回答 1

check解決した方法

0

自己解決しました!
memberモデルが Mongoidを使用していたのが悪影響していたみたいです。
Gemから Mongoidを一旦アンインストールして、ApplicationRecordで作成しなしたらうまくいきました!
反応いただいた方、ありがとうございました!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.71%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる