Ruby on Rails предотвращает ошибку nil, если предполагается, что запись может не существовать - PullRequest
1 голос
/ 21 сентября 2009

Я создаю простое приложение для проверки книг. Одна из вещей, которые мне нужно сделать, это определить, будет ли книга извлечена. У меня есть ассоциации между моими людьми и книжными классами, настроенными через класс book_check_out. Моя цель - использовать свойство check_out книги, чтобы определить, извлечена ли книга в данный момент. Тем не менее, в моей нынешней реализации, когда книга не извлечена и я ссылаюсь на book.checked_out.XXX, я получаю сообщение об ошибке " У вас есть нулевой объект, когда вы его не ожидали! " Моя цель состоит в том, чтобы используйте book.checked_out для двух целей в некоторых представлениях, чтобы показать, что да, эта книга извлечена, а в других представлениях показать, для кого она в настоящее время извлечена.

class Person < ActiveRecord::Base
  has_many :book_check_outs
  has_many :books, :through => :book_check_outs
end

class Book < ActiveRecord::Base

  has_many :book_check_outs
  has_many :people, :through => :book_check_outs

  def checked_out
    book_check_outs || false
  end
end

class BookCheckOut < ActiveRecord::Base
  belongs_to :book
  belongs_to :person
end

Ответы [ 2 ]

1 голос
/ 21 сентября 2009

Когда у вас есть логический результат, который может быть как истинным, так и ложным (например, книга может быть либо извлечена, либо нет), вам нужно принять значение по умолчанию для результата. В этом случае мы можем предположить, что это неверно (книга не выписана по умолчанию).

В модели книги удалите строку has_many: checked_out и создайте метод с тем же именем:

def checked_out
  book_check_outs || false
end

Это должно возвращать либо BookCheckOuts, либо, если с экземпляром нет ни одного, FALSE. Это дает вам быстрый, простой и надежный метод проверки ассоциации и устранения неприятной ошибки нулевого объекта.

Редактировать Вы также можете просто вернуть TRUE или FALSE и не возвращать самые последние проверки, проверив, что book_check_outs - ноль или нет. Rails предоставляет метод с именем blank? который называет оба ноль? и пусто?

def checked_out
  !book_check_outs.blank?
end

Я люблю Ruby:)

0 голосов
/ 21 сентября 2009

Я забываю, имеет ли это значение на самом деле или нет, но для ясности вы можете поставить отношение has_many над отношением has_many: through.

Я также не уверен, что вы должны объявить в классе Book, что он имеет: 1005 *

...