Дополнительный вопрос «Вы уверены?» перед уничтожением записи

#javascript #forms #ruby-on-rails-4 #controller #destroy

#javascript #формы #ruby-on-rails-4 #контроллер #уничтожить

Вопрос:

В некоторых моих формах у меня есть дополнительное всплывающее подтверждение «Вы уверены?» прежде чем это действительно уничтожит запись. Я использую Rails 4 и simple_form. Вот пример.

У меня есть модель под названием Promotions, а другая — PromotionPurchase.

Модели:

 class Promotion < ActiveRecord::Base
  has_many :promotion_purchases, dependent: :destroy
end

class PromotionPurchase < ActiveRecord::Base
  belongs_to :user
  belongs_to :promotion
end
 

Схема

 create_table "promotion_purchases", force: true do |t|
  t.integer  "user_id"
  t.integer  "promotion_id"
  t.string   "status"
  t.string   "stripe_card_token"
  t.string   "phone"
  t.string   "full_name"
  t.datetime "created_at"
  t.datetime "updated_at"
end

add_index "promotion_purchases", ["promotion_id"], name: "index_promotion_purchases_on_promotion_id"
add_index "promotion_purchases", ["user_id"], name: "index_promotion_purchases_on_user_id"

create_table "promotions", force: true do |t|
  t.string   "name"
  t.text     "description"
  t.integer  "cost_in_cents"
  t.integer  "amount_available"
  t.string   "category"
  t.datetime "start_date"
  t.datetime "end_date"
  t.datetime "created_at"
  t.datetime "updated_at"
end
 

И форма:

 <div class="content-box">
<%= simple_form_for [:admin, @promotion] do |f| %>
  <fieldset id="promotion-form-info">
    <%= f.input :name %>
    <%= f.input :description %>
    <%= f.input :category %>
    <%= f.input :cost_in_cents, as: :string %>
    <%= f.input :amount_available, as: :string %>
    <%= f.input :start_date, :as => :date_picker %>
    <%= f.input :end_date, :as => :datetime_picker %>
    <%= f.button :submit, class: 'btn btn-sm btn-success' %>
  </fieldset>
<% end %>
<% if @promotion.id != nil %>
  <fieldset id="promotion-form-purchases">
    <h3>Purchases:</h3>
    <% if !@purchases.empty? %>
      <table class="table">
        <tr>
          <th>Name</th>
          <th>Email</th>
          <th>Phone</th>
          <th>Status</th>
          <th></th>
        </tr>
        <% @purchases.each do |purchase| %>
          <tr>
            <td><%= purchase.full_name %></td>
            <td><%= purchase.user.email if purchase.user %></td>
            <td><%= purchase.phone %></td>
            <td><%= purchase.status %></td>
            <td>
              <%= link_to "Edit", edit_admin_promotion_promotion_purchase_path(@promotion, purchase), class: "btn btn-xs btn-success" %>
              <%= link_to 'Delete', [:admin, @promotion, purchase], method: :delete, data: { confirm: 'Are you sure?' }, class: "btn btn-xs btn-danger" %> 
              <%= "<- Editing this purchase" if @purchase amp;amp; purchase.id == @purchase.id %>
            </td>
          </tr>
        <% end %>
      </table>
    <% end %>
    <p>
      <%= link_to "Add Purchase", new_admin_promotion_promotion_purchase_path(@promotion), class: "btn btn-sm btn-primary" %>
    </p>
  </fieldset>
<% end %>
</div>
 

И контроллер

 class Admin::PromotionPurchasesController < ApplicationController
  layout 'admin'
  before_action :set_promotion
  before_action :set_purchase, only: [:edit, :update, :destroy]

  def destroy
    @purchase.destroy
    redirect_to new_admin_promotion_promotion_purchase_path(@promotion), success: 'PromotionPurchase was deleted.'
  end

  private

    def set_promotion
      @promotion = Promotion.find(params[:promotion_id])
    end

    def set_purchase
      @purchase = PromotionPurchase.find(params[:id])
    end
end
 

Есть идеи, почему я вижу «Вы уверены?» дважды вместо только одного раза, когда я удаляю PromotionPurchase из формы для редактирования рекламной акции?

В этом случае я видел это три раза:

Список покупок, связанных с этой акцией
Первое quot;Вы уверены?
Второй
Третий

Комментарии:

1. Можете ли вы опубликовать этот снимок?

2. можете ли вы опубликовать свой макет, файл маршрутов?

3. Удаление является разрушительным. Заявите, что это желаемое поведение для предотвращения случайной потери данных, и отправьте его;] / шутки

Ответ №1:

Опубликованный вами код, похоже, в порядке.

Я думаю, что проблемы возникают из-за javascript. (проверьте консоль, возможно, вы там что-то увидите)

Кроме того, вы, возможно, импортировали jquery_ujs много раз, попробуйте удалить jquery_ujs from application.js и посмотрите, произойдет ли что-нибудь, если импортируется только один раз, вы не должны получать это диалоговое окно.

Комментарии:

1. Когда я удаляю эту строку из application.js , я вообще не получаю диалоговое окно, и это выдает мне ошибку маршрутизации.

2. Вы видите эту ошибку маршрутизации в журналах сервера или в браузере?

3. Это нормально, jquery_ujs отвечает за обработку method параметров. Без этого ссылка становится простым получением , и я предполагаю, что у вас нет маршрута показа ?

Ответ №2:

Попробуйте просто ввести простое <script> в форму и поместить туда предупреждение. Если это предупреждает 3 раза, значит, ваша проблема заключается в загрузке файла слишком много раз.