现在我无法使用user.save命令
user.rb文件
class User < ActiveRecord::Base
before_save { self.email = email.downcase }
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true,
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
has_secure_password
validates :password, length: { minimum: 6 }
end
20140831002057_add_password_digest_to_users.rb档案
class AddPasswordDigestToUsers < ActiveRecord::Migration
def change
add_column :users, :password_digest, :string
end
end
我输入
User.create(name: "A Nother", email: "another@example.org")
之后
user.save
我无法使用此命令。 如果你知道原因请帮助我。
(当我使用
时User.create(name: "Michael Hartl", email: "mhartl@example.com", password: "foobar",
password_confirmation: "foobar")
我无法使用此命令...)
答案 0 :(得分:2)
如果你使用create
之后你不需要save
,或者你可以写:
user = User.new(name: "A Nother", email: "another@example.org")
user.save
还User
!= user
答案 1 :(得分:0)
create method :如果验证通过,则创建一个对象(或多个对象)并将其保存到数据库。无论对象是否已成功保存到数据库,都会返回结果对象。
如果您阅读源代码,很容易理解。
def create(attributes = nil, &block)
if attributes.is_a?(Array)
attributes.collect { |attr| create(attr, &block) }
else
object = new(attributes, &block)
object.save # it has been saved
object
end
end
因此,如果您通过'created'方法创建对象,则无需保存它。
答案 2 :(得分:0)
<强>公约强>
在我看来,您似乎没有设置user
变量集,尽管这并不能解释create
方法未触发的情况。
正如IS04
所述,这是您users
控制器所需要的:
#app/controllers/users_controller.rb
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new user_params
@user.save
end
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
end
这是在rails应用程序中创建新记录的已接受(conventional)方式。您也最好在Rails 4中研究strong params的角色。我不确定Hartl的教程是如何更新的;上次我听说,他正在开发Rails 3,这与Rails 4的语法不同。
另外,请注意我们如何保存@user
变量(不是纯Model
个对象)? 非常非常重要,因为这意味着您可以将数据作为变量的一部分进行操作 - 如果您只是将数据提交给模型,那么您将会结束一系列数据对象,你根本无法改变/操纵。
-
创建强>
当您拨打User.create
时,您遇到的问题是您没有收到回复。这意味着你无法告诉问题。
我推荐以下内容(我假设您从控制器调用此内容,而不是rails console
):
user = User.create(name: "test", email: "test@test.com", password: "testest", password_confirmation: "testest")
Rails.logger.info(user.errors.full_messages.inspect()) unless user.save
这将显示已捕获的错误。
最重要的是,我相信您的has_secure_password
电话会遇到问题。我以前没有广泛使用过这个,所以我不认为自己是合适的人。但如果这不起作用就有意义了。
如果您使用上面的错误输出(将显示在您的控制台中),您将能够辨别出错误的真实含义,让您对问题更加具体化