Rails - 表单助手中的虚拟属性

时间:2011-03-04 23:57:52

标签: ruby-on-rails ruby-on-rails-3 forms virtual-attribute

我在表单助手中遇到了一个奇怪的错误。

我的模型看起来像这样:

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 个答案:

答案 0 :(得分:5)

试试这个:

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

问题是,它试图访问不存在的“父”的名称。所以父在这一点上是Nil对象而你正在尝试访问Nil对象的属性“name” - &gt;失败

编辑:也许它更适合返回一个空字符串,如:

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

答案 1 :(得分:1)

看起来该错误信息正在说

self.parent

中返回nil
def parent_name