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

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

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

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

Devise

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

Q&A

解決済

3回答

788閲覧

deviseで作成されたコントローラーに対して、処理を追加したい

fork_

総合スコア43

Ruby on Rails 5

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

Devise

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

0グッド

0クリップ

投稿2020/08/29 13:03

編集2020/08/29 13:49

Deviseでログイン機能を作成しました。
実現したいこととしては、ユーザーの新規登録時に、予めuserテーブルに新規追加しておいたaccountnameカラムにランダムな値を生成して、保存したいです。

従来であればDeviseでカラム追加した場合には、新規登録時のviewファイルに、<%= f.text_field :accountname%>のような形で書き、application_controller.rbにカラム追加の処理を書けばうまく行きますが、
今回のケースでは直接コントローラー側のcreateアクションでランダムな文字列を生成して、saveしたいです。

registrations_controllerを編集して値が保存されるか試してみたところ、値が保存されませんでした。
どのようにすればregistrations_controllerを編集できるようになりますでしょうか。

関係ありそうな記述を下記に記載します。何卒よろしくお願いいたします。

# frozen_string_literal: true class Users::RegistrationsController < Devise::RegistrationsController before_action :configure_sign_up_params, only: [:create] # before_action :configure_account_update_params, only: [:update] # GET /resource/sign_up # def new # super # end # POST /resource def create super @user = User.new(configure_sign_up_params) @user.accountname = "testname" @user.save end # GET /resource/edit # def edit # super # end # PUT /resource # def update # super # end # DELETE /resource # def destroy # super # end # GET /resource/cancel # Forces the session data which is usually expired after sign # in to be expired now. This is useful if the user wants to # cancel oauth signing in/up in the middle of the process, # removing all OAuth session data. # def cancel # super # end protected # If you have extra params to permit, append them to the sanitizer. def configure_sign_up_params devise_parameter_sanitizer.permit(:sign_up, keys: [:accountname]) end # If you have extra params to permit, append them to the sanitizer. # def configure_account_update_params # devise_parameter_sanitizer.permit(:account_update, keys: [:attribute]) # end # The path used after sign up. # def after_sign_up_path_for(resource) # super(resource) # end # The path used after sign up for inactive accounts. # def after_inactive_sign_up_path_for(resource) # super(resource) # end end
## applicationController.rb class ApplicationController < ActionController::Base protect_from_forgery with: :exception # before_action :configure_permitted_parameters, if: :devise_controller? def after_sign_out_path_for(resource) "/users/logout" end protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:accountname]) end end

補足: 下記の記述でも試してみましたが、うまく行きませんでした...。

def create super User.create(accountname: "testname") end

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

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

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

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

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

no1knows

2020/08/30 08:47

> accountnameカラムにランダムな値を生成して、保存したいです。 どのような目的で実装するのでしょうか?
fork_

2020/08/31 00:52

Twitterのように、サインアップしたときはユニークな文字列がユーザーに割り振られるように実装したい意図があります。
guest

回答3

0

お二方に詳細にご回答いただき、ありがとうございます。
解決の糸口がみつかりました。winterboum様、no1knows様、ありがとうございました。

投稿2020/08/31 02:11

fork_

総合スコア43

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

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

no1knows

2020/08/31 02:15

方向性が定まってよかったです。 できれば、「どのように実装してうまくいったのか」までをやってみてから、解決済みにしていただけると、今後、同様の問題で困った人が見た時に役立つかと思います。
guest

0

ベストアンサー

調べたら下記のような方法が見つかりました。
今のバージョンで対応できるのかなど検証は必要ですが、実装方法としては適切な気がします。

class Users::RegistrationsController < Devise::RegistrationsController before_filter :set_name_param, only: [:create] private def set_name_param # 姓名でわけているのでパラメータを適宜変更してください。 params[:user][:name] = "#{params[:user][:first_name]} #{params[:user][:last_name]}" end end

参考:https://stackoverflow.com/questions/34693091/rails-after-create-with-devise

投稿2020/08/31 01:08

no1knows

総合スコア3365

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

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

0

crate の場合、 super でsaveまでしてたのではないかな。
superの前に、paramsにaccountnameを追加しておくのではどうでしょう

投稿2020/08/29 13:53

winterboum

総合スコア23324

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

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

fork_

2020/08/30 01:14

ご回答いただきありがとうございます。 ====================================== def create @user = User.new(configure_sign_up_params) super end ====================================== のパターンと、 ====================================== def create @user = User.new(accountname: "test") super end ====================================== のパターンでやってみましたが、うまく行きませんでした....
winterboum

2020/08/30 02:42

いやそうではなく、 params[:user][:accountname] = "test" してから super params[:user] だとおもうけど、そこ必要により、logなどで確認してください。
fork_

2020/08/31 00:51

ご回答いただきありがとうございます。 承知いたしました。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問