Обработка ошибок в рельсах - PullRequest
1 голос
/ 14 октября 2010

Как ни странно, мне трудно найти хорошие документы по базовой обработке ошибок в рельсах. Буду признателен за любые хорошие ссылки, а также за мысли об обработке ошибок в самом простом методе, подобном этому:

  def self.get_record(id)
    People.first( :conditions => ["id = ?", id] )
  end

1) Я могу проверить, что id! = Nil и что он числовой.

2) Затем я мог бы также убедиться, что запись найдена.

Есть что-нибудь еще?

Рекомендуются ли практики № 1 и № 2? В обоих случаях вы просто создадите флэш-сообщение с ошибкой и отобразите его, или это выдает слишком много информации?

Ответы [ 2 ]

3 голосов
/ 14 октября 2010

Как я уверен, вы знаете, это похоже на People.find(id), за исключением того, что find вызывает ошибку.

Однако People.find_by_id(id) возвращает ноль, если запись не найдена, что, я подозреваю, позаботится обо всем, что вам нужно. Вам не нужно проверять, что вы помещаете в ActiveRecord правильный тип данных и тому подобное; он обрабатывает риски внедрения SQL, поэтому проверка заранее не повлияет на реальное поведение.

Если мы просто смотрим на действие show, то есть еще более элегантный способ: вместо использования find_by_id и проверки на nil, используйте find, пусть ошибка всплывет и контроллер ловит его с помощью rescue_from. (По умолчанию в работе ActiveRecord::RecordNotFound будет пойман и спасен при отображении универсального 404, но вы можете настроить это поведение при необходимости.)

class UsersController < ApplicationController
  rescue_from ActiveRecord::RecordNotFound, :with => :not_found

  def show
    @user = User.find params[:id]
  end

  protected
    def not_found
      flash[:error] = "User not found"
      redirect_to users_path
    end
end

Код не проверен, только для иллюстрации;)

0 голосов
/ 14 октября 2010

Не делайте вспышку [: note], просто скажите, что "Запись не найдена"

Две требуемые вами вещи могут быть выполнены следующим образом:

1) Я могу проверить, что id! = Nil и что он числовой.

def self.get_record(id)
  People.first( :conditions => ["id = ?", id] ) if id.integer? unless id.blank?
end

2) Затем я мог бы также убедиться, что запись найдена.

def self.get_record(id)
  @people = People.first( :conditions => ["id = ?", id] ) if id.integer? unless id.blank?
  flash[:notice] = @people.blank? # this will print true/false depending on value in @people
end

Надеюсь, это работает для вас. : D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...