Rails - виртуальный атрибут в форме помощника

У меня странная ошибка с виртуальным атрибутом в форме помощника.

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

class Folder < ActiveRecord::Base
 ...
  # VIRTUAL ATTRIBUTES
  def parent_name
   self.parent.name
  end

  def parent_name=(name)
    self.parent = self.class.find_by_name(name)
  end
  ...
end

Я использую HAML и SimpleForm. Когда я использую свою форму, как это...

= simple_form_for [@collection, form], :html => { :class => 'full' } do |f|
  = f.input :name
  = f.input :description
  = f.submit

... это работает отлично. Но если я попытаюсь получить доступ к виртуальному атрибуту, как это...

= simple_form_for [@collection, form], :html => { :class => 'full' } do |f|
  = f.input :name
  = f.input :parent_name
  = f.input :description
  = f.submit

... я получаю эту ошибку:

NoMethodError in Folders#index

Showing ... where line #3 raised:

undefined method `name' for nil:NilClass

Extracted source (around line #3):

1: = simple_form_for [@collection, form], :html => { :class => 'full' } do |f|
2:  = f.input :name
3:  = f.input :parent_name
4:  = f.input :description
5:  = f.submit

Какие-либо предложения?

2 ответа

Решение

Попробуй это:

def parent_name
 self.parent.nil? ? nil : self.parent.name
end

Проблема в том, что он пытается получить доступ к имени "родителя", которого не существует. Таким образом, родительский объект в данный момент является объектом Nil, и вы пытаетесь получить доступ к атрибуту "имя" объекта Nil -> Fails

Изменить: может быть, более целесообразно вернуть пустую строку, например:

self.parent.nil? ? "" : self.parent.name

Похоже, что сообщение об ошибке говорит, что

self.parent

возвращается ноль внутри

def parent_name
Другие вопросы по тегам