我无法使用user.save命令。导轨教程

时间:2014-08-31 07:09:19

标签: ruby-on-rails ruby railstutorial.org

我是日本的高中生。 呃,你知道原因,请帮助我。

现在我无法使用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")

我无法使用此命令...)

3 个答案:

答案 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电话会遇到问题。我以前没有广泛使用过这个,所以我不认为自己是合适的人。但如果这不起作用就有意义了。

如果您使用上面的错误输出(将显示在您的控制台中),您将能够辨别出错误的真实含义,让您对问题更加具体化