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

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

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

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

Devise

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

Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

3705閲覧

Rails deviseのcontroller内でif文を使いたい

no1knows

総合スコア3365

Ruby on Rails 5

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

Devise

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

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/02/22 11:52

編集2019/02/22 21:19

前提・実現したいこと

Railsを始めて5日目の初心者です。

deviseを使ってユーザー登録必須のシステムを作っています。
下記3つを実装後、ユーザー情報の更新時にif文を追加するとエラーメッセージが発生しました。

1.ユーザー情報の更新にパスワード入力をしなくてもよいようにする。
https://kossy-web-engineer.hatenablog.com/entry/2018/11/06/102047

2.deviseで作成したUserモデルにnameカラムを追加し名前を登録できるようにする。
https://qiita.com/hz1_d/items/77e440b09a1ddbe56263

3.companyモデルを作成する。

発生している問題・エラーメッセージ

NoMethodError in RegistrationsController#update undefined method `user_url' for #<RegistrationsController:0x00007ffc986c65c8> Did you mean? user_unlock_url

該当のソースコード

routes.rb

ruby

1Rails.application.routes.draw do 2 3 resources :companies 4 root 'home#top' 5 6 get 'home/top' 7 8 devise_for :users, 9 controllers: { registrations: 'registrations' } 10 11end

registrations_controller.rb

ruby

1class RegistrationsController < Devise::RegistrationsController 2 3 protected 4 def update_resource(resource, params) 5 resource.update_without_current_password(params) 6 if @user.present? 7 end 8 end 9 10end

user.rb

ruby

1class User < ApplicationRecord 2 3 devise :database_authenticatable, :registerable, 4 :recoverable, :rememberable, :validatable, 5 :confirmable, :lockable, :timeoutable, :trackable 6 7 def update_without_current_password(params, *options) 8 params.delete(:current_password) 9 10 if params[:password].blank? && params[:password_confirmation].blank? 11 params.delete(:password) 12 params.delete(:password_confirmation) 13 end 14 15 result = update_attributes(params, *options) 16 clean_up_passwords 17 result 18 end 19 20end

application_controller.rb

ruby

1class ApplicationController < ActionController::Base 2 3 before_action :authenticate_user! 4 5 protect_from_forgery with: :exception 6 before_action :configure_permitted_parameters, if: :devise_controller? 7 8 protected 9 10 def configure_permitted_parameters 11 added_attrs = [ :email, :name, :company_id, :password, :password_confirmation ] 12 devise_parameter_sanitizer.permit :account_update, keys: added_attrs 13 end 14 15end

rails routes

ruby

1Prefix Verb URI Pattern Controller#Action 2 companies GET /companies(.:format) companies#index 3 POST /companies(.:format) companies#create 4 new_company GET /companies/new(.:format) companies#new 5 edit_company GET /companies/:id/edit(.:format) companies#edit 6 company GET /companies/:id(.:format) companies#show 7 PATCH /companies/:id(.:format) companies#update 8 PUT /companies/:id(.:format) companies#update 9 DELETE /companies/:id(.:format) companies#destroy 10 root GET / home#top 11 home_top GET /home/top(.:format) home#top 12 new_user_session GET /users/sign_in(.:format) devise/sessions#new 13 user_session POST /users/sign_in(.:format) devise/sessions#create 14 destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy 15 new_user_password GET /users/password/new(.:format) devise/passwords#new 16 edit_user_password GET /users/password/edit(.:format) devise/passwords#edit 17 user_password PATCH /users/password(.:format) devise/passwords#update 18 PUT /users/password(.:format) devise/passwords#update 19 POST /users/password(.:format) devise/passwords#create 20 cancel_user_registration GET /users/cancel(.:format) registrations#cancel 21 new_user_registration GET /users/sign_up(.:format) registrations#new 22 edit_user_registration GET /users/edit(.:format) registrations#edit 23 user_registration PATCH /users(.:format) registrations#update 24 PUT /users(.:format) registrations#update 25 DELETE /users(.:format) registrations#destroy 26 POST /users(.:format) registrations#create 27 new_user_confirmation GET /users/confirmation/new(.:format) devise/confirmations#new 28 user_confirmation GET /users/confirmation(.:format) devise/confirmations#show 29 POST /users/confirmation(.:format) devise/confirmations#create 30 new_user_unlock GET /users/unlock/new(.:format) devise/unlocks#new 31 user_unlock GET /users/unlock(.:format) devise/unlocks#show 32 POST /users/unlock(.:format) devise/unlocks#create 33 rails_service_blob GET /rails/active_storage/blobs/:signed_id/*filename(.:format) active_storage/blobs#show 34rails_blob_representation GET /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show 35 rails_disk_service GET /rails/active_storage/disk/:encoded_key/*filename(.:format) active_storage/disk#show 36update_rails_disk_service PUT /rails/active_storage/disk/:encoded_token(.:format) active_storage/disk#update 37 rails_direct_uploads POST /rails/active_storage/direct_uploads(.:format) active_storage/direct_uploads#create

試したこと

if文を削除してcompanyにレコードを追加してみたところエラーは発生しませんでした。

ruby

1 @company = Company.new 2 @company.save

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

ruby 2.6.1p33
rails 5.2.2
devise 4.6.1

噛み砕いた内容でご回答をいただけたら大変助かります。
どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Devise::RegistrationsControllerを継承した独自のRegistrationsControllerでupdate_resourceを定義することによって、update_resourceを上書き(オーバーライド)しています。

で、もともとのupdate_resourceの内容はこちらです。
https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb#L93
こういった使われ方をしています。
https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb#L50
返り値が利用されていますね?(つまりはresource.update_with_password(params)の返り値)

一方で、zilchさんがif文を入れたupdate_resourceの返り値は何になるでしょうか?
irbで、if true; endを実行してみてください。自ずと答えは出ると思います。

投稿2019/02/22 21:51

Kta-M

総合スコア456

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

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

no1knows

2019/02/24 15:49

丁寧に説明いただきありがとうございます! UPDATEもオーバーライドする形ですすめてみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問