2012-10-20 76 views
1

我是Rails的新手,並使用此代碼更新或插入。Rails 3.2.8根據條件插入或更新

user = User.find_by_email(params[:email]) 
if user.nil? 
    User.create!(params) 
else 
    user.save(params) 
end 

// params is a hash with keys as table columns 

此代碼無效。另外,我想知道Rails在一行中是否有神奇的功能?

我還沒有宣佈email作爲主鍵,但它將是唯一的。它會幫助我宣佈它是主要的嗎?

回答

6

您的代碼不起作用,因爲save的參數是作爲選項的散列(例如運行驗證),而不是對屬性的更改。您可能需要改爲update_attributes!。我通常會寫類似

User.where(:email => params[:email]).first_or_initialize.update_attributes!(params) 
+0

是的,我就是你的答案是'save'並不需要的屬性參數之前注意到。你能分享一個資源,我可以在哪裏找到一個簡短的軌道方法摘要/文檔? – Jashwant

+0

您的回答正常。 'first_or_initialize'在這裏做什麼? – Jashwant

+0

apidock.com還行。 first_or_initialize返回第一個匹配行或用戶的新實例 –

0

嘗試這種方式

user = User.find_by_email(params[:email]) # if you receive email in params[:email] 
unless user.present? 
    @user = User.create!(params[:user]) # params[:user] replace with whatever you receive all your attributes 
else 
    @user = user # here if your want to update something you can do it by using update attributes 
end