2017-04-16 14 views
0

我試着尋找一個答案,但他們都使用User.new等,而不是創建。Rails的用戶模型沒有被分配一個ID當使用User.create()

在具有有效屬性的控制檯中使用User.create()時,我得到一個用nil創建的用戶ID和nil的時間戳。

這是我的用戶模型。

class User < ApplicationRecord 
    attr_writer :name, :email 
    before_save {self.email = email.downcase} 

    validates :username, presence:true, 
         length: {maximum: 30}, 
         uniqueness:true 


    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i 
    validates :email, presence:true, 
        length: {maximum:200}, 
        format: {with: VALID_EMAIL_REGEX}, 
        uniqueness: {case_sensitive: false} 

    has_secure_password 

    validates :password, presence: true, 
         length: {minimum:6} 

end 

在軌控制檯我使用

User.create(username:"oiuedhioj", email:"[email protected]",password:"test",password_confirmation:"test") 

並取回

<User id: nil, username: "Damhan", email: nil, created_at: nil, updated_at: nil, password_digest: "$2a$10$oGtRgcHigaHh/UCVX4QdM.AOgyGur8Oud5MyKZheUcQ..."> 
+0

@Iceman你能解釋一下你的評論,這樣每個人都可以學習嗎?操作系統是否也需要發佈其控制器代碼? –

+0

@Iceman沒有解決我的問題 –

回答

2

嘗試在rails控制檯中進行創建。

返回沒有Id或時間戳的記錄是無效記錄的標誌。

user = User.create(...) 
user.valid? 
=> false 
user.errors.any? 
=> true 
+0

非常感謝,這是一個錯誤。我的密碼太短,你的方法非常好,我將來會用它來調試。 –

0

你只設置nameemail爲可寫。包括id和該列表上的其他屬性。或者,如果您的導軌版本是4+,請在您的控制器中使用strong parameters

#user_controller.rb 

... 
private 

def user_params 
    params.require(:user).permit(:id, :name, :email ...) 
end 
... 
+0

Rails將所有列添加爲默認可訪問。你的想法是從Rails 3開始的attr_accessible。 – fbelanger

0

除了你已經得到了提示,使用create!save!等來代替它們的補充,以獲取有關錯誤的異常,從而快速失敗的,因此更容易調試代碼。如果您有充分的理由,請僅使用不帶!的變體。由於您必須手動檢查錯誤,因此有適當的例外通常會更清潔。

+0

Nah在生產代碼中不使用'!'。除非你準備好趕上例外。 AR被設計爲由於驗證而失敗,而沒有引發例外。通過這種方式,您可以完成請求,並在存在錯誤字段時通過帶有錯誤字段的表單進行回覆。 – fbelanger

+0

是的,在生產中絕對使用'!'。驗證工作很好。顯然你確實發現了你期望發生的事情,並知道如何處理它!手動檢查錯誤只是對最難的錯誤的公開邀請。谷歌「快速失敗」,看看我的意思。 @fbelanger – AnoE

+0

不要在AR上使用爆炸。當然可以在其他地方引發例外情況,但是對於每一種可能的驗證都會引發異常。原因是強制手動檢查(捕獲)。發送錯誤的對象返回到表單將突出顯示字段。 http://stackoverflow.com/questions/1761076/when-do-i-use-save-create-and-update-attributes-in-rails – fbelanger

相關問題