2012-02-27 70 views
0

在一個循環內,我試圖將該值設置爲對象的鍵值。不知道如何做到這一點:使用一個值在Ruby中設置一個對象的鍵值

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

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

返回的錯誤:NoMethodError:未定義的方法`鍵=」

回答

3

Ruby中的函數調用就像消息傳遞一樣。所以你要找的是send

您示例中的@account對象不是像@user這樣的哈希,它是一個Class實例。

但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) } 

最後EXA因爲@account.key = value實際上是一個方法調用的語法糖:@account.key=(value)

我強烈建議通過Rails Form Helpers閱讀和建立你的表格如何建議。

+0

謝謝亞當,更新後的例子爲我工作。真棒。 – oprogfrogo 2012-02-27 21:31:24

0

它看起來像你想要的是讓@ account.username是123,和@ account.full_name是「John Doe」,對嗎?

帳戶是否有usernamefullname屬性?它有key屬性嗎?它顯然沒有key,因爲這就是你得到這個錯誤的原因。

如果賬戶確實有usernamefullname,然後就去做:

@account.update_attributes!(@user) 

如果沒有的話,我不知道你想做什麼。

0

這樣做;

@user = {"username" => "123", "full_name" => "John Doe"} 
@account = Account.new 
@user.keys.each{|key| eval("@account.#{key} = @user[key]")} 
相關問題