Активность кнопки по времени rails

261
07 апреля 2017, 23:06

Проблема заключается в том, что понятия не имею как записать логику. Имеется страничка тех. поддержки, пользователь оставляет заявку, в личном кабинете у него доступна табличка с его обращением, где есть кнопки "просмотреть", "редактировать" и "удалить". Но нужно сделать так, чтобы кнопка "удалить" была доступна только 30 минут от времени создания заявки. Мне бы понять, где это прописать, и как. Мысль есть прописать в контролере, но логику пока до конца не могу разобрать.

if (request.created_at <= DateTime.now+1.minute &&  DateTime.now+1.minute > DateTime.now)
            = button_to 'Удалить', request_path(request),method: :delete, title: 'Удаление', class: 'btn btn-danger', data: { confirm: 'Вы уверены, что хотите удалить?' } do
              %i.fa.fa-trash-o
            -#= link_to request_path(request), method: :delete, title: 'Удаление', class: 'btn btn-danger', data: { confirm: 'Вы уверены, что хотите удалить?' } do
          - else
            = button_to 'Удалить', request_path(request),method: :delete, title: 'Удаление', class: 'btn btn-danger', disable: true, data: { confirm: 'Вы уверены, что хотите удалить?' } do
              %i.fa.fa-trash-o

На данный момент дошел лишь до этого, но что-то запутался, и, возможно, допущены ошибки и неправильная логика. Желательно простенький пример для рассмотрения и понимания.

Answer 1

Несколько шагов:

1. Назовем модель иначе, чем Request

На всякий случай. Потому что request и response в рельсах - зарезервированные имена для обращения к запросу и ответу от сервера. Если использовать Request для модели - явных ошибок от рельс вы не увидите, но потом можете внезапно столкнуться с проблемами.

Я называю такие модели SiteRequest, и использую site_request для хранения отдельной записи модели.

2. Проверять время нам нужно в двух местах

Во-первых, во вьюхе при выводе кнопки. Показывать кнопку, если с момента создания заявки прошло менее 30 минут. Но есть еще одно место:

Кейс: 28 минут с момента создания заявки. Страница загрузилась, кнопка на ней видна. Пользователь кликнул по ней спустя 3 минуты. Заявку удаляем или нет? Ведь в момент клика по кнопке - прошла уже 31 минута с момента создания.

Если учесть этот кейс - нужно добавить условие на 30 минут и в экшн удаления заявки site_requests#destroy. Одно и то же условие в двух разных местах на сайте.

3. Сохраним условие в одном общем месте

Чтобы не писать и там, и там "Если прошло меньше 30 минут с момента создания задания" - запишем это условие, например, в методе модели:

class SiteRequest < ApplicationRecord
  # Ваш существующий код модели
  def allow_to_destroy?
    created_at + 30.minutes <= DateTime.now
  end
end

4. Используем метод модели для проверки

Во-первых - во вьюхе (написано на slim):

- if site_request.allow_to_destroy?
  = link_to 'Удалить', site_request, method: :delete,
            title: 'Удаление',
            class: 'btn btn-danger',
            data: { confirm: 'Вы уверены, что хотите удалить?' } do
    i.fa.fa-trash-o

Во-вторых - в экшне destroy:

class SiteRequestsController < ApplicationController
  def destroy
    site_request = SiteRequest.find(params[:id])
    if site_request.allow_to_destroy?
      if site_request.destroy
        flash[:success] = 'Заявка успешно удалена'
      else
        flash[:error] = 'Заявку не удалось удалить'
      end
    else
      flash[:error] = 'С момента создания заявки прошло 30 минут, вы не можете ее удалить'
    end
    redirect_to :site_requests
  end
end
Answer 2

Если заявка сохраняется в БД: - То необходимо создать условие появление кнопки удалить и редактировать. Для этого советую почитать документацию к библиотеке Time . А дальше, простые математические и логические операции с колонкой "created_at" относящейся к конкретной заявке. - Логику лучше всего писать в Helper , что бы не засорять вьюхи.

Код не стал специально писать, так как информация в вопросе не способствует погружению в бизнес логику.

READ ALSO
Как сделать загрузку на кнопке asp.net mvc?

Как сделать загрузку на кнопке asp.net mvc?

Есть вот такая ajax форма для переписки:

259
Помогите с добавить значения в массив

Помогите с добавить значения в массив

Не получается добавить значение в массив, что делаю не так?

321