From: Robert Klemme Date: 2009-01-30T22:33:34+09:00 Subject: Re: Creating a ruby class with mass assignment 2009/1/30 Ruby Nooby : > Hi, > How do I create a ruby class that has mass assignment functionality? I > want it to work in a similar way to the way in which ActiveRecord does, > ie. > MyClass.new > => # > MyClass.new(:name => "Cool class") > => # > MyClass.new(:name => "Cool class", :other_attribute => "some other") > => # > > I have found the following code snippit which works for the mass > assignment part but doesn't work if I initialize the class without any > arguments: > > class MyClass > attr_accessor :name > attr_accessor :other_attribute > > def initialize(args) > args.keys.each { |name| instance_variable_set "@" + name.to_s, > args[name] } > end > end > > MyClass.new > ArgumentError: wrong number of arguments (0 for 1) > from (irb):19:in `initialize' > from (irb):19:in `new' > from (irb):19 > > What is the best way of achieving mass assignment whilst still allowing > to initialize without parameters? You can make your life considerably easier by using Struct: irb(main):001:0> Test = Struct.new :foo, :bar, :baz do irb(main):002:1* def self.create(h = {}) irb(main):003:2> new(*members.map {|m| h[m.to_sym]}) irb(main):004:2> end irb(main):005:1> end => Test irb(main):006:0> Test.create(:foo => 1) => # irb(main):007:0> Test.create(:bar => 3, :foo => 123) => # Kind regards robert -- remember.guy do |as, often| as.you_can - without end