2013-10-29 36 views
0

当我尝试注册一个用户时,它不会给我任何错误,但不能保存用户。 我没有attr_accessible。我不确定我错过了什么。请帮帮我。Rails 4,注册新用户时不保存@ user.save

user.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"=>"[email protected]", "password"=>"[FILTERED]", "nickname"=>"example"}, "commit"=>"Register"} 
(0.1ms) begin transaction 
User Exists (0.2ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = '[email protected]' LIMIT 1 
User Exists (0.1ms) SELECT 1 AS one FROM "users" WHERE "users"."nickname" = 'example' LIMIT 1 
(0.1ms) rollback transaction 
+0

你有没有在数据库中验证没有用户记录被创造出来的? –

+0

是的,我的数据库中没有用户记录。 – Yuichi

+0

'@ user.save'是否返回'true'或'false'? –

回答

1

错误发生在密码确认中的可能性很高。您使用Rails中的has_secure_password,它自动为您处理密码确认。这就是问题 - 在用户创建之前你没有这个问题。因此只需添加。有关详细信息检查出has_secure_password

并检查类似question,你有password_digest:string在用户表:)

+0

我终于通过在'models/user.rb'中添加'has_secure_password validations:false'解决了这个问题。非常感谢您的帮助! – Yuichi

2

关于我们的短discussi在评论,似乎一两件事情正在发生造成@user.save返回false

  • 之一验证规则是失败
  • 回调模型内返回false,从而停止加工,回滚事务

有几个快速的方法来调试验证。我想我可以描述他们,所以你可以学习一些选择。

A.更改呼叫的if语句中,而不是使用save的爆炸方法:

if @user.save! 

这会导致应用程序如果验证失败时抛出异常,在浏览器内显示的验证错误你的屏幕。在这种特殊情况下,在完成调试后,您应该记得删除!,因为您可能不希望最终版本的应用程序执行此操作。

或者......

B.内else声明,加入这一行:

raise @user.errors.to_yaml 

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

或者......

C.内else声明,加入这行,然后运行该窗体发布:

puts @user.errors.to_yaml 

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

您可能想要尝试其中的每一种方法以获得一些练习,并在简单的调试场景中查看您的选择。

+0

非常感谢你对这些调试程序,这些是真正有用的技术,我不知道!我会用这些! – Yuichi

+0

不客气。我认为有更好的调试工具,我应该看看,但这通常对我来说很好。祝你的程序好运! –