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

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

ただいまの
回答率

87.34%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 518

score 19

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


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

*_edt.html.erb*

<div class="modal-dialog modal-lg modal-dialog-center">
    <div class="modal-content"> 
    <div class="modal-header"> 
  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
        <span aria-hidden="true"></span>
      </button>
    <h1 class="modal-title">お客様情報編集</h1>
  </div> 
    <div class="modal-body"> 
<div class="row">
        <div class="col-md-6 col-md-offset-3">
<%= form_for(resource, as: resource_name, url: user_registration_path) do |f| %>
 <div class="js-message-errors"></div>


<div class="field">
  <%= f.label :name, class: "label-signup" %><br />
  <%= f.text_field :name, autofocus: true, autocomplete: "name", class: "form-control" %>
</div>

  <div class="field">
    <%= f.label :email, class: "label-signup" %><br />
    <%= f.email_field :email, autofocus: true, autocomplete: "email", class: "form-control" %>
  </div>

  <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
    <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
  <% end %>

  <div class="field">
  <%= f.label :contact, class: "label-signup" %><br />
  <%= f.number_field :contact, autofocus: true, autocomplete: "contact", min: 1, max: 31, class: "form-control" %>
</div>

  <div class="field">
    <%= f.label :password ,class: "label-signup"%></i><br />
    <%= f.password_field :password, autocomplete: "new-password", class: "form-control" %>
    <% if @minimum_password_length %>
      <br />
      <em><%= @minimum_password_length %> characters minimum</em>
    <% end %>
  </div>

  <div class="field">
    <%= f.label :password_confirmation, class: "label-signup" %> (パスワードを変更する場合は必須です)<br />
    <%= f.password_field :password_confirmation, autocomplete: "new-password", class: "form-control" %>
  </div>

  <div class="field">
    <%= f.label :current_password , class: "label-signup"%> (1つでも項目を変更する場合は必須です)<br />
    <%= f.password_field :current_password, autocomplete: "current-password", class: "form-control" %>
  </div>


    <%= f.submit "更新する",class: "btn btn-primary btn-block btn-signup" %>
<% end %>
</div> 
    </div> 
</div> 
</div>
</div>
Rails.application.routes.draw do

  get 'sessions/new'

  devise_for :users, controllers: {
    sessions:      'users/sessions',
    passwords:     'users/passwords',
    registrations: 'users/registrations'
  }
  devise_for :admins, controllers: {
    sessions:      'admins/sessions',
    passwords:     'admins/passwords',
    registrations: 'admins/registrations'
  }
  # トップページ
  root 'home#top'
  # ログイン機能
  get    '/login', to: 'sessions#new'
  post   '/login', to: 'sessions#create'
  delete '/logout', to: 'sessions#destroy'
  # モーダルページ
  get '/top_overview', to: 'home#top_overview'
  resources :users do
    member do
      get 'edit_admin_index' #admin.indexの編集
      patch 'update_admin_index'#admin.indexの編集
    end
  end 
end
*application_controller*


class ApplicationController < ActionController::Base
  before_action :configure_account_update_params, if: :devise_controller?
  protect_from_forgery with: :exception

  private
    def storable_location?
      request.get? && is_navigational_format? && !devise_controller? && !request.xhr? 
    end



    def after_sign_in_path_for(resource_or_scope)
      stored_location_for(resource_or_scope) || super
    end




  protected

  def configure_account_update_params
    devise_parameter_sanitizer.permit(:account_update, keys: [:name, :contact])

  end
end

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

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 23:59

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

    キャンセル

  • 2021/01/23 11:43

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

    キャンセル

  • 2021/01/23 21:16

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

    キャンセル

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

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る