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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1895閲覧

Railsのdeviseで作ったモデルにカラムを追加したい

hatsu

総合スコア1809

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/10/09 05:11

編集2017/10/10 11:46

Ruby on Rails5、rubyは2.4.0を用いて
初めてdeviseというgemを使用してuesrログインの機能を追加しました。
emailとパスワードによるログインは正常に行うことができました。
そこで次にnameカラムを追加しようと思い、name絡むを追加するmigrationファイルを作成しました。作成されたのが以下のファイルです。

ruby

1class AddNameToUsers < ActiveRecord::Migration[5.1] 2 def change 3 add_column :users, :name, :string 4 end 5end

また調べながらuser.rbの編集も行いました。編集したのが以下になります。

ruby

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :trackable, :validatable, :omniauthable 6 7 def self.find_for_oauth(auth) 8 user = User.where(uid: auth.uid, provider: auth.provider).first 9 10 unless user 11 user = User.create( 12 uid: auth.uid, 13 provider: auth.provider, 14 name: auth.info.name, 15 email: User.dummy_email(auth), 16 password: Devise.friendly_token[0, 20] 17 ) 18 end 19 20 user 21 end 22 23 private 24 25 def self.dummy_email(auth) 26 "#{auth.uid}-#{auth.provider}@example.com" 27 end 28end

そしてもちろんview/refistrations/new.html.erbやedit.html.erbにはフォームもnameフォームも作成いたしました。

ruby

1<h2>Sign up</h2> 2<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> 3 <%= devise_error_messages! %> 4 5 <div class="field"> 6 <%= f.label :name %><br /> 7 <%= f.text_field :name, autofocus: true, :placeholder => '名前', class: 'form-control login_mail_form font-awesome' %> 8 </div> 9以下省略

しかしいずれもviewではエラーが出ないものの保存がされないです。

コマンドからuser登録をさせようとすると以下のように出て来ます。

ruby

1irb(main):004:0> user3 = User.new(email: "hoge@gmail.com",name:"testuser3") 2=> #<User id: nil, email: "hoge@gmail.com", created_at: nil, updated_at: nil, uid: nil, provider: nil, name: "testuser3"> 3irb(main):005:0> user3.save 4 (0.2ms) begin transaction 5 User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = ? LIMIT ? [["email", "hoge@gmail.com"], ["LIMIT", 1]] 6 (0.1ms) rollback transaction 7=> false

多くのサイトを拝見するも解決方法が見つからず長いことここでつまずいております。
解決方法のわかるかた、心当たりある方、気になる点がある方、ぜひともご教授いただけますと大変嬉しく思います。
何卒よろしくお願いいたします。

###追記
UsersControllerです。

ruby

1class UsersController < ApplicationController 2 before_action :set_user, only: [ :update, :destroy ] 3 4 def index 5 @users = User.all 6 end 7 8 def show 9 @user = User.find(params[:id]) 10 end 11 12 13 def edit 14 end 15 16 def update 17 if @user.update( user_params ) 18 redirect_to root_path 19 else 20 render :edit 21 end 22 end 23 24 def destroy 25 if @user.destroy 26 redirect_to root_path 27 else 28 render :edit 29 end 30 end 31 32 private 33 def set_user 34 @user = User.find( params[:id] ) 35 end 36 37 def user_params 38 params.require(:user).permit(:email, :password, :name) 39 end 40end

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chelsy7110

2017/10/10 06:53

UserControllerを追記お願いします
hatsu

2017/10/10 11:47

ありがとうございます。UsersControllerを追記いたしました。ご確認よろしくお願いいたします。またご不明点があれば随時対応いたしますのでお気軽にご相談ください。
guest

回答2

0

ベストアンサー

コマンドの方は

User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = ? LIMIT ? [["email", "hoge@gmail.com"], ["LIMIT", 1]]

こういうエラーですので、hoge@gmail.comが既に存在するというエラーです。
メールアドレスを変えて実行してみてください。

Viewから登録出来ないのは、UserControllerを見てから出ないと確実ではないですが、エラーが出ないということであればStrongParametersの記述を追記していないとかではないかと思います。

投稿2017/10/10 06:55

chelsy7110

総合スコア596

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsu

2017/10/11 23:41

ありがとうございます。調べて見た所サニタイザーというのと、ストロングパラメーターが大事になってくることがわかり編集したところusernameの保zんができるようになりました。
guest

0

https://qiita.com/yasuno0327/items/ff17ddb6a4167fc6b471

以前これと同じことをしてカラム追加しましたよ!

投稿2017/10/10 03:30

drizzing20

総合スコア363

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問