2017-04-16 39 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