Question

I want to create large number of attributes which can be done with ease if constructed with method call like this,

 attr_accessor :attr_list 

 def attr_list
   [:x1, :y1, :x2, :y2]   
 end

This is not working. Is there any other way to achieve this?

Any help will be appreciated.

Was it helpful?

Solution

Figured it out,

def self.attr_list
 [:x1, :y1, :x2, :y2]   
end

attr_accessor *attr_list 

Explanation:

As attr_accessor is a method call which expects parameters list. So we can not pass array as it is. (*) will convert array into parameters list.

Just need to define a class method returning array of attribute list passed to attr_accessor.

Works well with attr_accessible(or anything similar) as well.

OTHER TIPS

One way to do this without incurring a warning:

class MyClass
    ATTR_LIST = [:x1, :y1, :x2, :y2]
    attr_accessor(*ATTR_LIST)
end

The accepted solution produces a ruby warning:

'*' interpreted as argument prefix

An alternative would be to do something like this:

def attr_list
  [:x1, :y1, :x2, :y2]   
end

attr_list.each { |attr| attr_accessor attr }

or

ATTR_LIST = [:x1, :y1, :x2, :y2]
ATTR_LIST.each { |attr| attr_accessor attr }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top