2011-03-05 5 views
0

私はRuby on Rails 3を使用しており、ハッシュ(keyvalueペア)をカプセル化されたRubyクラス(テーブルレスモデル)にマップしてkeyvalueを返すクラスメソッドとしてマップしようとしています。私はカプセル化されたRubyクラス(テーブルレスモデル)のメソッドにハッシュキーをマップする方法は?

class Users::Account #< ActiveRecord::Base 
    def initialize(attributes = {}) 
    @id  = attributes[:id] 
    @firstname = attributes[:firstname] 
    @lastname = attributes[:lastname] 
    end 
end 

def self.to_model(account) 
    JSON.parse(account) 
end 

を持っているモデルファイルで

私のハッシュは、私は(デバッグ)

--- 
id: 2 
firstname: Name_test 
lastname: Surname_test 
01を返し

account = Users::Account.to_model(hash) 

を作ることができます

hash = {\"id\":2,\"firstname\":\"Name_test\",\"lastname\":\"Surname_test\"} 

です

それに動作しますが、私は

account.id 

をすれば、私は<Hash:0x00000104cda410>は、クラス自体(!)ハッシュではないので、私が思う

NoMethodError in Users/accountsController#new  
undefined method `id' for #<Hash:0x00000104cda410> 

このエラーが発生します。また、私はaccount = Users::Account.to_model(hash)をやっていることが正しいアプローチではないと思います。

どうしたのですか?これらのハッシュキーをクラスメソッドに「マップ」するにはどうすればよいですか?

答えて

0

あなたはハッシュでクラスを初期化していません。あなたはする必要があります:

json = "{\"id\":2,\"firstname\":\"Name_test\",\"lastname\":\"Surname_test\"}" 
hash = Users::Account.to_model(json) 
account = Users::Account.new(hash) 

次に、account.idは値を与えます。

1

あなたはこの

account = Users::Account.from_json(json) 

とそこに

def self.from_json(json_str) 
    new(JSON.parse(json_str)) 
end 

私は、多くの場合、ハッシュから初期化するために使用し、「ブロック初期化」もありますようにそれを書き換えるとしたらそれは良くなります https://github.com/guerilla-di/tracksperanto/blob/master/lib/tracksperanto/block_init.rb これを使用する場合、クラス定義を

class Users::Account 
    include BlockInit 
    attr_accessor :id, :firstname, :lastname 
    def self.from_json(json_str) 
    new(JSON.parse(json_str)) 
    end 
end 
に変換できます
関連する問題