2012-05-25 37 views
3

我有關於Ruby的車型on Rails的一個問題:如何在Rails上使用參數動態更改模型的字段?

我有一個接收列的名稱,該列的新值on Rails的這個方法:

def change_attribute 
    field = params[:field] 
    new_value = params[:new_value] 
    person = Person.find(params[:id]) 
    person.update_attribute(field, new_value) 
    render :text=>"", :layout=>false 
end 

但是,這將引發我一個錯誤:該字段不存在,我想應該是這樣的:名稱,:名字等

我如何轉換我的領域變量爲其中之一dinamically使這一功能工作?

+1

'update_attribute'跳過驗證。小心使用它! – jdoe

回答

2

你應該檢查你params[:field]得到的字段名稱是否是完全一樣的原始字段名(沒有多餘的空格等)。您可以通過puts params[:field].inspect進行檢查並在終端(軌道服務器啓動的位置)中檢查它。

根據該文檔爲update_attribute,我們將能夠通過字符串或符號作爲字段名。所以,在將字段參數傳遞給update_attribute之前,您不必擔心將字段參數轉換爲符號。正如你所看到的源代碼,在這裏:

def update_attribute(name, value) 
    name = name.to_s 
    raise ActiveRecordError, "#{name} is marked as readonly" if self.class.readonly_attributes.include?(name) 
    send("#{name}=", value) 
    save(:validate => false) 
end 

它首先轉換爲字符串,然後調用setter。正如@jdoe提到的,它不驗證模型(請參閱代碼中的save(:validate => false)一行),因此在使用此方法時應注意這一點。

相關問題