0

当我尝试注册用户时,它没有给我任何错误,只是无法保存用户。我没有attr_accessible。我不确定我错过了什么。请帮我。

用户.rb

class User < ActiveRecord::Base
  has_secure_password
  validates :email, presence: true,
                    uniqueness: true,
                    format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i }
  validates :password, presence: true, length: {minimum: 6}
  validates :nickname, presence: true, uniqueness: true
end

users_controller.rb

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)             # Not saving @user ...
    if @user.save
      flash[:success] = "Successfully registered"
      redirect_to videos_path
    else
      flash[:error] = "Cannot create an user, check the input and try again"
      render :new
    end
  end

  private

  def user_params
    params.require(:user).permit(:email, :password, :nickname)
  end
end

日志:

Processing by UsersController#create as HTML
Parameters: {"utf8"=>"✓",    "authenticity_token"=>"x5OqMgarqMFj17dVSuA8tVueg1dncS3YtkCfMzMpOUE=", "user"=>{"email"=>"example@example.com", "password"=>"[FILTERED]", "nickname"=>"example"}, "commit"=>"Register"}
(0.1ms)  begin transaction
User Exists (0.2ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" = 'example@example.com' LIMIT 1
User Exists (0.1ms)  SELECT 1 AS one FROM "users" WHERE "users"."nickname" = 'example' LIMIT 1
(0.1ms)  rollback transaction
4

2 回答 2

2

关于我们在评论中的简短讨论,似乎发生了一两件事导致@user.save返回false

  • 验证规则之一失败
  • 模型中的回调正在返回false,从而停止处理并回滚事务

有几种快速调试验证的方法。我想我可以描述它们,这样你就可以学习一些选项。

A. 将if语句中的调用更改为使用 bang 方法save

if @user.save!

如果验证失败,这将导致应用程序引发异常,并在屏幕上的浏览器中显示验证错误。在这种特殊情况下,您需要记住!在完成调试后删除 ,因为您可能不希望您的应用程序的最终版本这样做。

或者...

B. 在else语句中,添加以下行:

raise @user.errors.to_yaml

这将在屏幕上的浏览器中显示验证错误。当然,请记住在完成调试后删除此行。

或者...

C. 在else语句中,添加这一行,然后运行表单 post:

puts @user.errors.to_yaml

这将在您的控制台中显示验证错误。完成调试后,您需要记住删除此行,但如果您碰巧忘记了,情况会“不那么糟糕”,因为至少额外信息仅输出到STDOUT.

您可能想尝试其中的每一个,只是为了进行一些练习,看看在像这样的简单调试场景中您的选择是什么。

于 2013-10-30T02:39:20.380 回答
1

密码确认错误的可能性很大。您has_secure_password从 Rails 使用,它会自动为您处理密码确认。这就是问题所在 - 在创建用户之前您没有它。因此只需添加。有关详细信息,请查看类似的问题has_secure_password

并检查您是否password_digest:string在用户表中:)

于 2013-10-30T06:43:37.387 回答