Проблема заключается в том, что понятия не имею как записать логику. Имеется страничка тех. поддержки, пользователь оставляет заявку, в личном кабинете у него доступна табличка с его обращением, где есть кнопки "просмотреть", "редактировать" и "удалить". Но нужно сделать так, чтобы кнопка "удалить" была доступна только 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
На данный момент дошел лишь до этого, но что-то запутался, и, возможно, допущены ошибки и неправильная логика. Желательно простенький пример для рассмотрения и понимания.
Несколько шагов:
На всякий случай. Потому что request
и response
в рельсах - зарезервированные имена для обращения к запросу и ответу от сервера. Если использовать Request
для модели - явных ошибок от рельс вы не увидите, но потом можете внезапно столкнуться с проблемами.
Я называю такие модели SiteRequest
, и использую site_request
для хранения отдельной записи модели.
Во-первых, во вьюхе при выводе кнопки. Показывать кнопку, если с момента создания заявки прошло менее 30 минут. Но есть еще одно место:
Кейс: 28 минут с момента создания заявки. Страница загрузилась, кнопка на ней видна. Пользователь кликнул по ней спустя 3 минуты. Заявку удаляем или нет? Ведь в момент клика по кнопке - прошла уже 31 минута с момента создания.
Если учесть этот кейс - нужно добавить условие на 30 минут и в экшн удаления заявки site_requests#destroy
. Одно и то же условие в двух разных местах на сайте.
Чтобы не писать и там, и там "Если прошло меньше 30 минут с момента создания задания" - запишем это условие, например, в методе модели:
class SiteRequest < ApplicationRecord
# Ваш существующий код модели
def allow_to_destroy?
created_at + 30.minutes <= DateTime.now
end
end
Во-первых - во вьюхе (написано на 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
Если заявка сохраняется в БД: - То необходимо создать условие появление кнопки удалить и редактировать. Для этого советую почитать документацию к библиотеке Time . А дальше, простые математические и логические операции с колонкой "created_at" относящейся к конкретной заявке. - Логику лучше всего писать в Helper , что бы не засорять вьюхи.
Код не стал специально писать, так как информация в вопросе не способствует погружению в бизнес логику.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Не получается добавить значение в массив, что делаю не так?