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

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

新規登録して質問してみよう
ただいま回答率
85.51%
Ruby on Rails 5

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

Devise

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

Q&A

解決済

2回答

1138閲覧

railsのdeviseでのオーバーライドについて

tkd00

総合スコア6

Ruby on Rails 5

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

Devise

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

0グッド

0クリップ

投稿2022/12/13 16:25

編集2022/12/14 12:46

前提

以下のコードでdeviseの各種コードを生成しました。

rails g devise:install rails g devise User rails g devise:controllers users

app/controllers/users/registrations_controller.rb
のcreateメソッドをオーバーライドし処理を追加しました。
railsを起動し、新規登録するとcreateメソッドに追加した処理が実行されます。

実現したいこと

rails consoleから
User.createを実行したときに、オーバーライドした処理が実行されません。
どういったメソッド?を実行すればよいのでしょうか。

user = User.create(email:"test@example.com", password:"test0101") user.id => 101

該当のソースコード

app/controllers/users/registrations_controller.rb

ruby

1class Users::RegistrationsController < Devise::RegistrationsController 2 # before_action :configure_sign_up_params, only: [:create] 3 # before_action :configure_account_update_params, only: [:update] 4 5 # GET /resource/sign_up 6 # def new 7 # super 8 # end 9 10 # POST /resource 11 def create 12 super {|user| 13 user.update(id: user.id*100) 14 } 15 end 16end

app/models/user.rb

ruby

1Class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable 6end

config/routes.rb

ruby

1Rails.application.routes.draw do 2 devise_for :users, :controllers => { 3 :registrations => 'users/registrations', 4 :sessions => 'users/sessions' 5 } 6end

補足情報(FW/ツールのバージョンなど)

ruby 2.5.3
Rails 5.2.8.1

2022/12/14 追記

integer型のカラム id100を追加
db/schema.rb

ruby

1ActiveRecord::Schema.define(version: 2022_12_14_000216) do 2 3 create_table "users", force: :cascade do |t| 4 t.string "email", default: "", null: false 5 t.string "encrypted_password", default: "", null: false 6 t.string "reset_password_token" 7 t.datetime "reset_password_sent_at" 8 t.datetime "remember_created_at" 9 t.datetime "created_at", null: false 10 t.datetime "updated_at", null: false 11 t.integer "id100" 12 t.index ["email"], name: "index_users_on_email", unique: true 13 t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 14 end 15 16end

app/controllers/users/registrations_controller.rbを変更

ruby

1class Users::RegistrationsController < Devise::RegistrationsController 2 # before_action :configure_sign_up_params, only: [:create] 3 # before_action :configure_account_update_params, only: [:update] 4 5 # GET /resource/sign_up 6 # def new 7 # super 8 # end 9 10 # POST /resource 11 def create 12 super {|user| 13 user.update(id100: user.id*100) 14 } 15 end 16end

rails serverから新規登録を行うと、id100にuser.id*100の値が書き込まれる。
rails consoleで確認すると

user = User.find(102) user.id100 => 10200

rails consoleでcreateを実行すると、id100はnilとなる。

user = User.create(email:"test4@example.com", password:"test0101") user.id100 => nil

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

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

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

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

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

guest

回答2

0

ベストアンサー

app/controllers/users/registrations_controller.rbのcreateメソッドをオーバーライドし処理を追加しました。

これはDeviseからユーザー登録した際に通るもので、User.createでモデルインスタンスだけ作成した場合には全く無関係です。

投稿2022/12/14 00:33

編集2022/12/14 00:33
maisumakun

総合スコア145062

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

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

tkd00

2022/12/14 02:13

ご回答ありがとうございます。 そういうことだったんですね。 例えばconsoleなどからでもDeviseを通るようにできないか調査してみたのですが、すぐにはわかりませんでした。 考え方のヒントでも構いませんのでよろしくお願いいたします。
maisumakun

2022/12/14 02:17

Deviseにこだわらず、モデル側のライフサイクルコールバックにセットすべき処理なのではないでしょうか。 (そもそも、何を狙って「idをずらす」ということを行いたいのかがわからないのでコメントしづらいです)
tkd00

2022/12/14 03:46

申し訳ありません。 実際の狙いを記述すると関連するコードが多く、見づらいと思い、簡易化したものを記載していました。 Userモデルにコールバックを登録して、そちらで処理を行おうとおもいます。 勉強になりました。ありがとうございます!!
guest

0

「実行はしているが id の修正はできないので実行されていないように見える」
なのかもしれません、
id ではなく、id100 とでもいうcolumnを作って試してみたらどうでしょう
もしくは rails c にて id を updateしてみて試すとか。

Database に何を使っているか そのversionは とか その接続に使っているgemのversionなどによるかと思いますがid を指定できない場合があります。
私の経験ですと、Rails2、Rails4、Rails6 の MySQL は指定できましたが、Rails4 の pg ではできませんでした。
Rails の時代が変わってるのでDBのversionも接続gemのversionもまちまちですので、それをもとにの推定(可能か否か) はできないです。

投稿2022/12/13 22:54

winterboum

総合スコア23282

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

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

tkd00

2022/12/14 00:27

ご回答ありがとうございます。 id100カラムを追加して実行してみましたが、 前回の挙動と変わっていないように思われます。 詳細は質問に追記しています。 勉強中の身ですので、いろいろ間違っていたらすみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問