2013-01-08 112 views
1

在這種SO回答undefined method `stringify_keys!' ruby on rails,在OP試圖建立一個「本田」字符串新車對象到何時使用屬性哈希

@car = Car.new(params[:car]) 

,並得到了字符串化按鍵錯誤。誰接電話的人說,他必須指定從表中的列(在這種情況下,「名稱」列)創建對象,

create expects to get an attributes hash and to stringify it's keys for the column names. 

If you have a column named name in your cars table then try this: 

@car = Car.new(:name => params[:car]) 

然而,當,我在看一個RailsCast其中Rbates創建一個條目帶有'name'字符串的表格和作爲布爾值的'winner'列。在他的控制器(他設置爲用json響應)中,他不使用屬性散列。他創建行動

def create 
    respond_with Entry.create(params[:entry]) 
    end 

爲什麼沒有Rbates必須使用屬性的哈希,並且,如果他能有,會是什麼屬性,即哈希是什麼樣子?像這樣?你是否需要爲每個專欄命名:ryans case:name and:winner?

def create 
    respond_with Entry.create(:name => params[:entry][:name], :winner => params[:entry]  [:winner] 
    end 

回答

0

在前面的問題中,params [:car]是一個字符串。軌的newcreate方法都想到哈希值,這就是爲什麼代碼被改變了:name => params[:car]

傳遞如果您使用的Rails的的form_for來構建你的表格,則params [:模型名稱]將有哪些鍵匹配模型屬性的哈希值。在這種情況下,不需要定製工作,只需使用params [:model_name]初始化模型即可正常工作。

1

這一切都取決於什麼params[:car]包含。在Railscast示例中,params[:car]是包含兩個條目(namewinner)的哈希。在另一個SO問題中,它看起來像params[:car]是一個包含汽車名稱的字符串。

Car.new將始終期望哈希值。如果你想傳遞一個值,你需要把它變成一個哈希值,並用一個鍵告訴Car.new你傳遞的是什麼值。