поднять ActiveRecord :: RecordNotFound (или любое состояние 404) для недопустимой даты

В моем контроллере контроллера я использую Свидание. новый для создания объекта даты для передачи в моем ActiveRecord.

end_range = Date.new(params[:year].to_i, params[:month].to_i, params[:day].to_i).end_of_day.to_formatted_s(:db)

Проблема с этим выше заключается в том, что если пользователь попытался изменить параметры в URL-адресе вручную, например, введя 40 для параметр дня, Date.new не работает (как и ожидалось). Тем не менее, я бы предпочел не иметь ошибку 500, если пользователь набрал что-то подобное, а вместо этого ошибку 404 (потому что на самом деле вы никогда не сможете сделать запись со днем ​​ 40 ).

Я пробовал различные условные выражения (, если и , за исключением операторов ), чтобы вызывать ActiveRecord :: RecordNotFound , если это не удается, но возвращает условную ошибку 500 перед выполнением условия (и поэтому никогда не возвращать 404).

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

11
задан Andrew Marshall 10 September 2012 в 01:11
поделиться

1 ответ

В этом случае вы можете спасти одно исключение и вызвать другое, если хотите переназначить исключения, которые не обрабатываются, в следующие типы:

def show
  begin
    end_range = Date.new(...)
  rescue ArgumentError
    # Invalid date
    raise ActiveRecord::RecordNotFound
  end
rescue ActiveRecord::RecordNotFound
  render(:partial => 'not_found', :layout => 'application', :status => :not_found)
end

Это могло бы быть более эффективным просто выполнить рендеринг и сразу же выйти из строя.

def show
  begin
    end_range = Date.new(...)
  rescue ArgumentError
    return render(:partial => 'date_not_found', :layout => 'application', :status => :not_found)
  end
end

Вы также можете сделать это в более широком смысле, используя метод rescue_from ApplicationController:

class ApplicationController < ActionController::Base
  rescue_from 'ArgumentError do
    render(:partial => 'exceptions/argument_error', :layout => 'application', :status => :not_found)
  end
end
30
ответ дан 3 December 2019 в 02:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: