создать новый объект в рельсах - PullRequest
3 голосов
/ 08 ноября 2011

Я не могу найти хороший пример этого, поэтому, пожалуйста, укажите мне правильное направление.

Я хочу создать объект с нуля с 2 атрибутами abbr и именем

Я пытаюсь сделать объект с 50 состояниями и DC. Поскольку я не вижу, чтобы этот список менялся часто, я не вижу необходимости в базе данных, возможно, я ошибаюсь.

Я безуспешно пробовал следующее:

new_state = Object.new        
new_state.abbr = state[:abbr]     
new_state.name = state[:name]

и я получаю undefined method abbr=' for #<Object:0x00000006763008>

Что я делаю не так?

Ответы [ 3 ]

4 голосов
/ 08 ноября 2011

Вы можете создать простой класс без базы данных:

class State
  attr_accessor :abbr, :name
end

new_state = State.new
new_state.abbr = state[:abbr]
new_state.name = state[:name]

Ваша версия не работает, потому что Объект не имеет abbr= или name= методов и не будет их создавать на лету.

3 голосов
/ 08 ноября 2011

Объект в Ruby довольно сильно отличается от объекта в JavaScript, к которому, я полагаю, вы привыкли, поэтому добавлять свойства на лету не так просто.Hash вместо этого очень похож на ассоциативный массив в JS, и вы можете использовать его для своих целей:

states = Hash.new # or just {}
states[state[:abbr]] = state[:name] # {'MD' => 'Maryland'}
states['AL'] = 'Alaska' # {'MD' => 'Maryland', 'AL' => 'Alaska'}
states.keys # => ['MD', 'AL']
states.values # => ['Maryland', 'Alaska']
states['AL'] # => 'Alaska'

Как вы можете видеть, Hash обеспечивает добавление, поиск и выборку из коробки, поэтому выдаже не нужно определять свой собственный класс.Также хорошей идеей будет замораживание содержимого после добавления к нему состояний.

2 голосов
/ 08 ноября 2011

Вы можете использовать декодер , который читает / сохраняет свои состояния / сокращения / i18n в YAML.

Decoder.i18n = :en
country = Decoder::Countries[:US]
country.to_s
# => "United States"    

state = country[:MA]
state.to_s
# => "Massachusetts"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...