简体   繁体   中英

Rails how to render two different modals for destroy action

I want to add confirmation modal when bank manager has to delete bank_employee without clients bank_employee.users = nil . If bank_employee has clients I want to render different modal - destroy_confirmation_modal . How to do it in a proper way? Where should I put if condition?

code snipped of edit.html.erb

  <div class="row">
    <div class="col-sm-12 col-md-12 col-xs-12 text-center bank-employee__button-wrapper bank-employees-users-registration__registrations-submit--wrapper">
      <a href="javascript:void(0)" id="primaryDestroyButton" class="bank-employee__button bank-employee__button-delete"><%= t('.delete') %></a>
      <%= f.submit t('.submit'), id: "formSubmit", class: "bank-employee__button bank-employee__button-submit"%>
    </div>
  </div>
<% end %> // this `end` comes from `form_for`
<%= button_to "", bank_employee_path(@bank_employee), method: :delete, form: {id: "bankEmployeeDestroyForm" }, class: "bank-employee__button-destroy" %>
<div class="row">
  <div class="col-xs-12 col-sm-12 col-md-12 text-center">
    <%= link_to bank_employees_path do %>
      <span class="bank-employee__back-button">
        <%= image_tag "icon_back.svg", alt: "Back icon", class: ""%>
        <%= t('.back') %>
      </span>
    <% end %>
  </div>
</div>
</div>
<%= render "destroy_confirmation_modal" %>

I don't think I should update my controller method but maybe I'm wrong?

controller.rb

def destroy
  authorize current_bank_employee
  @bank_employee = find_bank_employee(params[:id])
  if @bank_employee.users.any? && associated_bank_employees.present?
    reassign_users_and_notify_bank_employee
  elsif @bank_employee.users.any?
    render :edit
  else
    @bank_employee.destroy
    render :destroy_notice, locals: { old_bank_employee: @bank_employee, assigned: false }
  end
end

EDIT

my routes.rb

resources :bank_employees, except: [:show], concerns: [:with_datatable] do
  member do
    get :confirm
  end
end

rails routes showed me this path as confirm_bank_employee so I've changed if condition as follow

<% if @bank_employee.users.empty? %>
  <%= button_to "", confirm_bank_employee_path(@bank_employee), form: {id: "bankEmployeeDestroyForm" }, class: "bank-employee__button-destroy", remote: true %>
<% else %>
  <%= button_to "", bank_employee_path(@bank_employee), method: :delete, form: {id: "bankEmployeeDestroyForm" }, class: "bank-employee__button-destroy" %>
<% end %>

You need a different approach.

<% if @bank_employee.clients.empty? %>
 <%= button_to "", bank_employee_confirm_path(@bank_employee), form: {id: "bankEmployeeDestroyForm" }, class: "bank-employee__button-destroy", remote: true %>


<% else %>

 <%= button_to "", bank_employee_path(@bank_employee), method: :delete, form: {id: "bankEmployeeDestroyForm" }, class: "bank-employee__button-destroy" %>
<% end %>

now you need two things:

inside routes.rb create a collection for your blank_employee_confirm_path:

whatever setup you have, i assume you have some kind of blank_employees resources path:

resources :blank_employees do
 member do
  get :confirm
 end
end

now, inside your controller you need to add the method confirm:

def confirm
 ## do whatever you want do to here

 render :js
end

this will then head over to confirm.js

create a confirm.js.erb file inside your blank_employees view folder. To confirm this is working, you can add a console.log('it works') in it.

Once you have confirmed that it is working you can add the javascript code to the confirm.js.erb file:

$('#modal-body').html('<%= escape_javascript(render :partial => 'shared/your_confirmation_modal'%>');

with this setup, you need in your edit.html.erb file a <div id="modal-body"></div> that will take the modal. Also notice that in my example the confirmation modal is stored in "views/shared/_your_confirmation_modal.html" . Change the path to your setup or create the exact path in order to make this work!

Notice that the "confirm" path is for the blank_employees that have no clients. The button will be only rendered when there is no client. All the other logic you had before for the blank_employees with clients stay the same. You don't need to change there anything. If you had any logic inside there for blank_employees without any clients, move the code to the confirm method.

One more thing: Make sure to add to your destroy method a render :js as well, and inside destroy.js.erb add the same kind of logic like inside confirm.js.erb, beside that you want to render the modal for blank_employees with clients. Your destroy.js.erb file should look something like this:

 $('#modal-destroy').html('<%= escape_javascript(render :partial => 'shared/your_destroy_modal'%>');

Very important: Just like with the first modal, add a <div id="modal-destroy"></div> to your edit.html.erb file, otherwise it wont render the modal.

If something is unclear, let me know!

Greetings!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM