我希望从“新”视图创建并保存数据库中的新用户,但是新记录不会保存在数据库中。但是尝试从控制台进行此操作并且所有工作正常,如何修复?
这是我的用户控制器
class UsersController < ApplicationController
def index
@users = User.all
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
@user.save
redirect_to @user
end
def show
@user = User.find(params[:id])
end
private
def user_params
params.require(:user).permit(:email, :name)
end
end
这是来自控制台的日志,因为您可以看到事务运行
2.1.2 :001 > user = User.new(name:"mike", email:"qwerty123@gmail.com", password:"123456", password_confirmation:"123456")
=> #<User id: nil, name: "mike", email: "qwerty123@gmail.com", created_at: nil, updated_at: nil, password_digest: "$2a$10$uxFvZ4/T3rb2rQlEBAKkWuo13CUZsaBNG.DD5DPpHlI...">
2.1.2 :002 > user.save
(0.2ms) begin transaction
User Exists (0.4ms) SELECT 1 AS one FROM "users" WHERE "users"."name" = 'mike' LIMIT 1
User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER('qwerty123@gmail.com') LIMIT 1
Binary data inserted for `string` type on column `password_digest`
SQL (1.8ms) INSERT INTO "users" ("created_at", "email", "name", "password_digest", "updated_at") VALUES (?, ?, ?, ?, ?) [["created_at", "2014-11-13 10:08:01.402404"], ["email", "qwerty123@gmail.com"], ["name", "mike"], ["password_digest", "$2a$10$uxFvZ4/T3rb2rQlEBAKkWuo13CUZsaBNG.DD5DPpHlI3WjzUhl3.u"], ["updated_at", "2014-11-13 10:08:01.402404"]]
(204.8ms) commit transaction
=> true
这不起作用? 抱歉我的英文不好
答案 0 :(得分:1)
乍一看,您似乎必须在控制器中允许password
和password_confirmation
。尝试将user_params
方法更改为如下所示:
def user_params
params.require(:user).permit(:email, :name, :password, :password_confirmation)
end
修改即可。另外,请粘贴您的Web服务器日志中的摘录,以揭示您提交表单时发生的情况。
答案 1 :(得分:0)
尝试更改save
的{{1}},您可以获得更好的输出,显示缺失或格式错误的内容:
save!
答案 2 :(得分:0)
你必须阅读有关在rails 4中允许params和验证的内容。
如果您在属性(名称,电子邮件,密码)上验证用户模型,则不会保存任何记录,至少不会保留这些属性。
此外,出于安全原因,Rails要求允许每个表单中的预期参数,这将阻止任何人添加新字段并将其与表单一起提交。
看一下<{3}}是什么Mass assignment in rails以及第3和第4栏之间的区别。
另请查看validations和this,了解记录未成功保存的原因。
离::
user = User.new(name: "AnyName")
user.save
puts user.errors.messages -->> This will print email cannot be blank in your server if you are validating the presence of the email attribute.