Rails вернет объект успешно, но жалуется, что это NIL, если я пытаюсь получить доступ к его атрибуту - PullRequest
0 голосов
/ 23 февраля 2010

Я пытаюсь заполнить вложенное поле product_name, это Item.

В моей модели товара:

 class Item < ActiveRecord::Base
   attr_writer :product_name
   belongs_to :order
   belongs_to :product
   def product_name

     #Product.find_by_id(self.product_id) #=> returns the product object
     #self.product #=> returns the product object

     #Product.find_by_id(self.product_id).name #=> complains that 'name' is being called on nil
     #self.product.name #=> complains that 'name' is being called on nil
     #"foooobar" #=> returns "foooobar"

   end     
 end

Каждая из этих закомментированных строк ведет себя так, как описано. Чего я не понимаю - как можно что-то успешно вернуть объект, но потом жаловаться, что объект равен нулю, когда вы обращаетесь к его атрибуту?

Вот вся ошибка:

 NoMethodError in Orders#edit

Showing app/views/orders/_form.haml where line #18 raised:

undefined method `name' for nil:NilClass

Extracted source (around line #18):

17:       = item.hidden_field :product_id
18:       = item.text_field :product_name, :class => 'auto_complete_input'
19:       = item.text_field :quantity, :size => 2

Спасибо

Ответы [ 3 ]

1 голос
/ 23 февраля 2010

Возможно, вы захотите взглянуть на плагин and на http://github.com/raganwald/andand.

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

Основано исключительно на вашем примере:

Product.find_by_id(self.product_id).name #=> complains that 'name' is being called on nil

Реализация andand будет выглядеть так:

Product.find(self.product_id).andand.name 

И даже если первый оператор Product.find (self.product_id) вернет nil , он больше не вызовет неопределенный метод при ошибке nil.

PS:

Опять же, основываясь только на вашем коде, я вижу, что вы воспроизводите функциональность, сгенерированную с помощью ассоциации: own_to. По сути, это означает, что вы можете использовать:

self.product

Внутренняя часть:

Product.find_by_id(self.product_id)
0 голосов
/ 28 июня 2014

Дали ли вы правильную связь в вашей модели продукта и модели изделия, я думаю, что правильная связь может решить вашу ошибку.

0 голосов
/ 23 февраля 2010

Похоже, вы задаете действительно общий вопрос. Если вы задаете совершенно другой вопрос, чем я слышу, игнорируйте это. :)

Да, Ruby успешно возвращает объект, и объект nil. В Ruby метод может возвращать любое значение, а nil - это просто другое значение, которое может возвращать метод. Эти операторы, вероятно, выполняют запрос, который не возвращает никаких результатов, поэтому метод возвращает nil вместо ожидаемого объекта.

Более длинный ответ заключается в том, что Product.find_by_id(x) вызывает сгенерированный метод атрибута find_by_ для поля id, что аналогично вызову Product.find(:first, :conditions => ["id = ?", x]). Если вы посмотрите документацию для .find , вы заметите, что там написано

Найти первым - Это вернет [бла-бла-чёрный ...] Если ни одна запись не может быть найдена, возвращается ноль.

...