Как сопоставить ключи хеша с методами для инкапсулированного класса Ruby (модель без таблиц)? - PullRequest
0 голосов
/ 05 марта 2011

Я использую Ruby on Rails 3 и пытаюсь отобразить хеш (key, value пары) в инкапсулированный класс Ruby (модель без таблиц), создав хэш key в качестве метода класса, который возвращает value.

В файле модели у меня есть

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

Мой хэш

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

Я могу сделать

account = Users::Account.to_model(hash)

, который возвращает (отладка)

--- 
id: 2
firstname: Name_test
lastname: Surname_test

Это работает, но если я сделаю

account.id

Я получаю эту ошибку

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

Я думаю, что <Hash:0x00000104cda410> - это хеш (!), А не сам класс. Также я думаю, что account = Users::Account.to_model(hash) - это не правильный подход.

Что не так? Как я могу "сопоставить" эти хэш-ключи с методами класса?

Ответы [ 2 ]

1 голос
/ 05 марта 2011

Это выглядело бы лучше, если бы вы переписали это так

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
0 голосов
/ 05 марта 2011

Вы не инициализировали класс с помощью хэша.Вы должны сделать:

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

Тогда account.id даст значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...