Атрибут в модели Rails кажется нулевым, когда он не - PullRequest
0 голосов
/ 10 июня 2009

У меня очень раздражающая и трудно выясняемая ошибка в моем проекте rails.

После создания группы моделей и их связей я хочу перечислить их.

Но я продолжаю получать сообщение об ошибке «Не могу дублировать NilClass». То есть, пока я не перезагружу сервер. Тогда я могу перечислить их просто отлично.

При отладке этой проблемы выясняется, что ошибка возникает в методе в одной из моделей, когда я пытаюсь вернуть значение одного из его атрибутов. У меня есть точка останова в методе, и это то, что я получаю в отладчике:

    (rdb:5) self
    #<Bar id: 1037, foo: 2237, created_at: "2009-06-09 19:52:11", updated_at: "2009-06-09 19:52:47">
    (rdb:5) foo
    TypeError Exception: can't dup NilClass
    (rdb:5) attributes[:foo]
    nil
    (rdb:5) attributes["foo"]
    2237

Мне не важно, перезагрузить ли я страницу. Я получаю ту же ошибку до перезапуска сервера.

Моя модель в основном выглядит следующим образом (ошибка возникает в методе baz):

class FooBar < ActiveRecord::Base

    belongs_to  :foo, :class_name => "BarFoo", :foreign_key => "foo", :dependent => :destroy
    belongs_to  :bar, :class_name => "BarFoo", :foreign_key => "bar", :dependent => :destroy
    validates_presence_of :foo, :on => :create

    def baz
        [foo, bar].compact
    end
end

Моя схема выглядит так:

create_table "foo_bar", :force => true do |t|
    t.integer  "foo"
    t.integer  "bar"
    t.datetime "created_at"
    t.datetime "updated_at"
end

Обновление:

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

И я только что подтвердил, что read_attribute ("foo") возвращает то же самое, что read_attribute (: foo). Также как и self [: foo] и self ["foo"]. Ни один из них не возвращает ноль. Однако все они возвращают идентификатор foo вместо самого foo.

Ответы [ 3 ]

1 голос
/ 10 июня 2009

:foo не равно 'foo'. Это равно 'foo'.to_sym или 'foo'.intern.

irb(main):001:0> hash = {:foo => 10, 'foo' => 'bar'}
=> {"foo"=>"bar", :foo=>10}
irb(main):002:0> hash[:foo]
=> 10
irb(main):003:0> hash['foo']
=> "bar"
irb(main):004:0> hash[:foo.to_s]
=> "bar"
irb(main):005:0> hash['foo'.to_sym]
=> 10
irb(main):006:0> hash['foo'.intern]
=> 10
1 голос
/ 11 июня 2009

Наконец-то решил!

Хотя я не совсем уверен, почему, проблема исчезнет, ​​если я добавлю «unloadable» в определение модели:

class FooBar < ActiveRecord::Base

    unloadable

    belongs_to  :foo, :class_name => "BarFoo", :foreign_key => "foo", :dependent => :destroy
    belongs_to  :bar, :class_name => "BarFoo", :foreign_key => "bar", :dependent => :destroy
    validates_presence_of :foo, :on => :create

    def baz
        [foo, bar].compact
    end
end

На этом сайте я нашел решение. Я совершенно не понимаю, но это работает: -)

0 голосов
/ 10 июня 2009

Разница в том, что у вас другой ключ. В Ruby: foo - это не то же самое, что "foo" (: foo - это символ, а "foo" - это строка).

Вы можете попробовать это, поставив :foo.to_s, который преобразует символ в строку, если я не ошибаюсь.

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