Использование значения для установки ключа объекта в Ruby - PullRequest
0 голосов
/ 28 февраля 2012

Внутри цикла я пытаюсь установить значение в качестве ключа объекта.Не уверен, как это сделать:

@user = {"username"=>"123", "full_name"=>"John Doe"}

@account = Account.new
@user.keys.each { |key|
  @account.key = @user[key]
}

, который возвращает ошибку: NoMethodError: неопределенный метод `key = '

Ответы [ 3 ]

3 голосов
/ 28 февраля 2012

Вызовы функций в Ruby действуют как передача сообщений.Итак, что вы ищете: send .

Объект @account в вашем примере не является хешем, подобным @user, это экземпляр класса.

Но у Rails есть еще лучший способ инициализации модели с атрибутами:

@account = Account.new(username: '123', full_name: 'John Doe')

В контроллере Rails они обычно находятся в хэше params, если вы правильно написали форму:

@account = Account.new(params[:user])

Если вам нужно сделать это вручную, вы можете:

@account = Account.new

# set all attributes at once
@account.attributes = @user

# this also works, but it's the least desirable
@user.each {|key, value| @account.send("#{key}=", value) }

Последний пример работает, потому что @account.key = value на самом деле является синтаксическим сахаром для вызова метода: @account.key=(value)

Я оченьрекомендуем прочитать Rails Form Helpers и построить ваши формы так, как это предлагается.

0 голосов
/ 28 февраля 2012

Сделай так;

@user = {"username" => "123", "full_name" => "John Doe"}
@account = Account.new
@user.keys.each{|key| eval("@account.#{key} = @user[key]")}
0 голосов
/ 28 февраля 2012

Похоже, что вы хотите, чтобы @ account.username было 123, а @ account.full_name было "John Doe", верно?

Имеет ли учетная запись атрибуты username и fullname? Имеет ли он атрибут key? У него явно нет key, потому что именно поэтому вы получаете эту ошибку.

Если в учетной записи есть username и fullname, просто сделайте:

@account.update_attributes!(@user)

Если этого не произойдет, тогда я понятия не имею, что вы пытаетесь сделать.

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