Andrew
Andrew

Reputation: 43113

Rails - Virtual attribute in form helper

I'm having an odd error with a virtual attribute in a form helper.

My model looks like this:

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

I'm using HAML and SimpleForm. When I use my form like this...

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

... it works perfectly. But if I try to access the virtual attribute like so...

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

... I get this error:

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

Any suggestions?

Upvotes: 0

Views: 1541

Answers (2)

sled
sled

Reputation: 14625

Try this:

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

Problem is, that the it tries to access the name of the "parent" which doesn't exist. So parent is at this point Nil object and you're trying to access the attribute "name" of a Nil object -> Fails

Edit: maybe it's more suitable to return an empty string like:

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

Upvotes: 5

patrickmcgraw
patrickmcgraw

Reputation: 2495

It looks like that error message is saying that

self.parent

is returning nil inside

def parent_name

Upvotes: 1

Related Questions