6

I've a problem with the instance_variable_get method cause it's always returns nil object with one of my object instance. Here is my code:

logger.info "ASDF: " + @d_tree.inspect
logger.info "ASDF: " + @d_tree.instance_variable_get(:@content);

and the output is:

ASDF: #<DTree id: 11, parent_id: nil, content: "bababababa", subsidiary_info: "", deep_info: "blabla", title: "hello", direction: 1, created_at: "2010-10-26 19:27:32", updated_at: "2010-11-01 23:14:31", color: 2, cell_color: 2, howtoinfo: "howtoinfooo", textinfo: "textInfooo", locationinfo: "locationInfoooo", productinfo: "productinfoooo">
TypeError (can't convert nil into String):
    /app/controllers/d_trees_controller.rb:38:in `+'

According to the inspect the object seems to be fine, but the instance_variable_get returns a nil object

Thanks for your help!

1

3 Answers 3

3

instance_variable_get(arg)

It should return the value of the instance variable or nil if the instance variable is not set.

for example

we define the following class

  class Velpradeep
    def initialize(mark1, mark2)
      @m, @s = mark1, mark2
    end
end

During creation of the object of the class

obj = Velpradeep.new(98,96)

Then we can access the instance variables by using :

irb(main):046:0> obj.instance_variable_get(:@m)
=> 98

Access the undefined instance variables defined in the initialize method

irb(main):047:0> obj.instance_variable_get(:@p)
=> nil # provides nil bcz the instance variable is not defined 

If you want to access the variable before you need to set the instance variable using

instance_variable_set()

example :

irb(main):048:0> obj.instance_variable_set(:@p, 99)
=> 99

Then we can use, it will return the value of the instance variable....

irb(main):049:0> obj.instance_variable_get(:@p)
=> 99
Sign up to request clarification or add additional context in comments.

Comments

2

Although it's considered bad form to grab instance variables like this directly, as using attr_accessor is the preferred method, the problem in this particular instance is that there is no instance variable called @content. What you have appears to be an ActiveRecord attribute.

These are fetched using a different mechanism:

@d_tree.attributes[:content]

Generally this is even a little redundant as this will needlessly create a copy of the attributes hash. The typical way to access is:

@d_tree.content

These values are actually located in the @attributes instance variable managed by ActiveRecord.

Comments

0

instance_variable_get returns nil if the variable is uninitialized (or if it has been set to nil, of course).

So, obviously, @content hasn't been initialized yet.

Why it hasn't been initialized is impossible to tell, since you haven't shown us any actual code yet.

It looks like @d_tree might be an ActiveRecord object, in which case the solution is rather simple: ActiveRecord objects don't keep their state in instance variables, they are backed by a database.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.