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

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

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

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

Q&A

解決済

1回答

1722閲覧

deviseを使用したupdate失敗時の画面遷移がうまく行きません

zoff77

総合スコア19

Ruby on Rails 5

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

0グッド

0クリップ

投稿2021/01/21 04:13

ediページをモーダルで表示し、
更新が「失敗したらモーダル内にエラーメッセージを出す処理を行いたいです。
お忙しい中恐縮ですが、ご教授頂けないでしょうか。

■ 現状 → モーダルは出て更新もできるが、エラー時に元々のedit.html.erbに遷移してしまう

*_edit.html.erb(ここにエラーを出したい)*
イメージ説明

*edit.html.erb(こちらに遷移してしまう)*
イメージ説明

■ 行った対策 → edit.html.erbを手動で削除し_edit.html.erbのみにした
イメージ説明
■ 判らない内容 → 更新成功後のパスはregistrations_controllerに

*registrations_controller* def after_update_path_for(resource) end

を記入することで達成できるが、失敗時の処理はどのように書けば良いのか。。。

erb

1 2*_edt.html.erb* 3 4<div class="modal-dialog modal-lg modal-dialog-center"> 5 <div class="modal-content"> 6 <div class="modal-header"> 7 <button type="button" class="close" data-dismiss="modal" aria-label="Close"> 8 <span aria-hidden="true"></span> 9 </button> 10 <h1 class="modal-title">お客様情報編集</h1> 11 </div> 12 <div class="modal-body"> 13<div class="row"> 14 <div class="col-md-6 col-md-offset-3"> 15<%= form_for(resource, as: resource_name, url: user_registration_path) do |f| %> 16 <div class="js-message-errors"></div> 17 18 19<div class="field"> 20 <%= f.label :name, class: "label-signup" %><br /> 21 <%= f.text_field :name, autofocus: true, autocomplete: "name", class: "form-control" %> 22</div> 23 24 <div class="field"> 25 <%= f.label :email, class: "label-signup" %><br /> 26 <%= f.email_field :email, autofocus: true, autocomplete: "email", class: "form-control" %> 27 </div> 28 29 <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %> 30 <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div> 31 <% end %> 32 33 <div class="field"> 34 <%= f.label :contact, class: "label-signup" %><br /> 35 <%= f.number_field :contact, autofocus: true, autocomplete: "contact", min: 1, max: 31, class: "form-control" %> 36</div> 37 38 <div class="field"> 39 <%= f.label :password ,class: "label-signup"%></i><br /> 40 <%= f.password_field :password, autocomplete: "new-password", class: "form-control" %> 41 <% if @minimum_password_length %> 42 <br /> 43 <em><%= @minimum_password_length %> characters minimum</em> 44 <% end %> 45 </div> 46 47 <div class="field"> 48 <%= f.label :password_confirmation, class: "label-signup" %> (パスワードを変更する場合は必須です)<br /> 49 <%= f.password_field :password_confirmation, autocomplete: "new-password", class: "form-control" %> 50 </div> 51 52 <div class="field"> 53 <%= f.label :current_password , class: "label-signup"%> (1つでも項目を変更する場合は必須です)<br /> 54 <%= f.password_field :current_password, autocomplete: "current-password", class: "form-control" %> 55 </div> 56 57 58 <%= f.submit "更新する",class: "btn btn-primary btn-block btn-signup" %> 59<% end %> 60</div> 61 </div> 62</div> 63</div> 64</div>

rb

1Rails.application.routes.draw do 2 3 get 'sessions/new' 4 5 devise_for :users, controllers: { 6 sessions: 'users/sessions', 7 passwords: 'users/passwords', 8 registrations: 'users/registrations' 9 } 10 devise_for :admins, controllers: { 11 sessions: 'admins/sessions', 12 passwords: 'admins/passwords', 13 registrations: 'admins/registrations' 14 } 15 # トップページ 16 root 'home#top' 17 # ログイン機能 18 get '/login', to: 'sessions#new' 19 post '/login', to: 'sessions#create' 20 delete '/logout', to: 'sessions#destroy' 21 # モーダルページ 22 get '/top_overview', to: 'home#top_overview' 23 resources :users do 24 member do 25 get 'edit_admin_index' #admin.indexの編集 26 patch 'update_admin_index'#admin.indexの編集 27 end 28 end 29end 30 31

rb

1 2*application_controller* 3 4 5class ApplicationController < ActionController::Base 6 before_action :configure_account_update_params, if: :devise_controller? 7 protect_from_forgery with: :exception 8 9 private 10 def storable_location? 11 request.get? && is_navigational_format? && !devise_controller? && !request.xhr? 12 end 13 14 15 16 def after_sign_in_path_for(resource_or_scope) 17 stored_location_for(resource_or_scope) || super 18 end 19 20 21 22 23 protected 24 25 def configure_account_update_params 26 devise_parameter_sanitizer.permit(:account_update, keys: [:name, :contact]) 27 28 end 29end

registrations_controllerには更新成功時の遷移処理しか書いていません。
宜しくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

form_for(resource, as: resource_name, url: user_registration_path) do |f|
の場合、edit.html.erbが呼び出されます。現状はこちらの動きですね。

form_for(resource, as: resource_name, url: user_registration_path, remote: true) do |f|
にすれば、edit.js.erbが呼び出されるようになり、画面遷移は発生しなくなります。

ただ、remote: trueをつけた時の書き方はより複雑になります。
(update成功時の処理も書き換えないといけなくなります。)

試してみてうまくいかなければ、質問文変更やコメントなどしていただけたらと思います。

投稿2021/01/22 13:37

siruku6

総合スコア1382

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

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

zoff77

2021/01/22 14:59

ご丁寧にお答え下さり、ありがとうございます。remote: trueにしたところ実装ができました! 成功処理につきましては、自らで調べながら行ってみたいと思います。 ありがとうございました。
siruku6

2021/01/23 02:43

うまく行ったようで良かったです! remote: true をうまく使うと利用者の待ち時間を大幅に減らせるので、場面をうまく見極めてここぞというところで使いたいですね。 (書き方が複雑になるので、乱用は注意です...同僚に嫌がられます)
zoff77

2021/01/23 12:16

remote: trueはそのようなメリットもあるのですね!大変勉強になりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問