2011-04-14 67 views
11

大多數Rails的教程演示如何通過params哈希填充模型類,像這樣:創建從PARAMS哈希Rails的ActiveRecord的模式

class UsersController < ApplicationController 
    def create 
     @user = User.create(params[:user]) 

     # more logic for saving user/redirecting/etc.  
    end 
end 

如果模型中的所有屬性都應該是字符串這個偉大的工程。但是,如果某些屬性應該是整數或日期或其他類型,會發生什麼?

舉例來說,假設用戶類看起來像這樣

class User < ActiveRecord::Base 
    attr_accessible :email, :employment_start_date, :gross_monthly_income 
end 

的:電子郵件屬性應該是一個字符串,則:employment_start_date屬性應該是一個日期,以及:gross_monthly_income應該是一個小數。爲了使這些屬性具有正確的類型,是否需要將我的控制器操作更改爲類似這樣的內容?

class UsersController < ApplicationController 
    def create 
     @user = User.new 
     @user.email = params[:user][:email] 
     @user.employment_start_date = params[:user][:employment_start_date].convert_to_date 
     @user.gross_monthly_income = params[:user][:gross_monthly_income].convert_to_decimal 

     # more logic for saving user/redirecting/etc. 
    end 
end 
+0

你確定params [:user]會擁有所有的字符串嗎?我認爲params散列將在AR中使用時正確轉換。 – rmk 2011-04-14 18:07:53

+0

@rmk是的,你說得對。我在下面添加了一個答案,基本上講同樣的事情。我會將其標記爲已接受的答案,但我必須等待2天才能將自己的答案標記爲已接受的答案。 – 2011-04-14 18:11:08

回答

5

我真的在你的用戶模型添加一個before_save回調,以確保你想要的值是正確的格式,即:

class User < ActiveRecord::Base 
    before_save :convert_values 

    #... 

    def convert_values 
    gross_monthly_income = convert_to_decimal(gross_monthly_income) 
    #and more conversions 
    end 

end 

所以,你可以叫User.new(params[:user])在你的控制器,它遵循的格言「Keep your controllers skinny」

+0

這似乎應該工作。這是做這件事的「軌道」嗎?這似乎是一個經常會出現的情況,但在我的生活中,我找不到任何教程/指南顯示這一點。 – 2011-04-14 17:33:12

+0

添加了我更喜歡的新版本。 – 2011-04-14 17:37:34

+0

我喜歡before_save版本。雖然問題:根據[this](http://stackoverflow.com/questions/2685226/convert-input-to-integer-before-save-in-rails/2685601#2685601),Rails足夠聰明地進行轉換爲你執行類似@user = User.new(params [:user])的東西。如果是這樣的話,那麼我想這不是必要的?我不確定這是否是真的。 – 2011-04-14 17:40:35