Отключить маршрут на основе атрибута модели

Учитывая, что у меня есть Project модель, проект должен быть утвержден для редактирования, проект с status=pending не может быть отредактировано.

Раньше я делал это, скрывая ссылки редактирования в представлении на основе атрибутов состояния, но это не мешает пользователю вводить маршрут через браузер (например: projects/1/edit), как я могу сделать маршрут редактирования недоступным в рамках данного статуса проекта?

2 ответа

Решение

Вы не хотите делать условный маршрут. Контроллер проверяет состояние и разрешает обновление только в том случае, если status =='pending',

def edit
  @project = Project.find(params[:id])
  if @project.status == 'pending'
    render :head, :status=>401
  else
    #your edit code
  end
end

Пожалуйста, добавьте ниже before_action, на основании которого вы можете предотвратить редактирование проекта.

#projects_controller.rb 
before_action :can_edit?, only: :edit

def edit 
  #your existing implementation goes here. 
end 

 def can_edit?
    @project =  Project.where(id: params[:id]).first

    if @project.status == pending 
     flash[alert] = "Sorry can't be edited"
     redirect_to projects_path
    end
 end
Другие вопросы по тегам