我对Rails很陌生,所以我可能错过了一些明显的东西,但是我正忙着让bcrypt的has_secure_password
工作。
我正在尝试通过来自React前端的axios AJAX调用来注册用户。数据正在正确传递,我没有任何CORS问题,因为当我删除has_secure_password
行(并在所有适用位置替换:password
:password_digest
)时,用户进入数据库 - 只是没有加密密码。我已经整理了一堆以前的问题& has_secure_password
&上的答案似乎没什么用。
以下是我尝试创建新用户时服务器吐出的内容:
1| Started POST "/api/users" for 127.0.0.1 at 2017-02-19 20:51:19 -0500
2| Processing by Api::UsersController#create as HTML
3| Parameters: {"name"=>"test", "username"=>"test25", "email"=>"test@test.com", "password"=>"[FILTERED]", "user"=>{"name"=>"test", "username"=>"test25", "email"=>"test@test.com"}}
4| (0.1ms) BEGIN
5| (0.1ms) ROLLBACK
6| Completed 200 OK in 11ms (Views: 0.3ms | ActiveRecord: 4.2ms)
(尽管对最后一行感到乐观,但用户没有进入数据库。另外,请注意第3行后半部分中缺少的password
信息。)
这是我的用户模型:
class User < ApplicationRecord
has_secure_password
end
我也尝试在ActiveRecord::Base
使用ApplicationRecord
并在其中添加include ActiveModel::SecurePassword
,但两者都没有做任何事情。
这是我的创建用户控制器(这有点乱,因为我不是100%确定我在做什么):
def create
user = User.new(user_params)
if user.save
session[:user_id] = user.id
render json: { user: user }
else
render json: {error: "there was an error"}
end
end
private
def user_params
params.require(:user).permit(:name, :username, :email, :password)
end
AJAX调用将密码发送为password: [password here]
,我的表中有:password_digest
列。任何诊断错误的帮助都将非常感激。
感谢阅读!
已编辑添加:
在ruby控制台中创建用户可以正常工作
答案 0 :(得分:2)
好。我不喜欢这个解决方案,但最终工作了:
添加没有user_params
定义的用户。
class UsersController < ApplicationController
def index
end
def create
user = User.new({name: params[:name], username: params[:username], password: params[:password], email: params[:email]})
if user.save
render json: { user: user }
else
render json: {error: user.errors.full_messages}
end
end
end
我仍然想知道为什么这种情况发生了,因为它看起来很奇怪&amp;违反直觉的行为,我认为拥有user_params
定义是更好的做法。
编辑:感谢有用的朋友,我发现问题实际上是我从前端发送AJAX调用的方式。我把它设置成这样:
axios.post('/users', {
name: e.target.name.value,
password: e.target.password.value,
other_option: e.target.option.value
}).then((res) => { /* do some stuff */ })
.catch((err) => console.log(err));
当我发送的对象真的应该是......
axios.post('/users', {
user: {
name: e.target.name.value,
password: e.target.password.value,
other_option: e.target.option.value
},
}).then((res) => { /* do some stuff */ })
.catch((err) => console.log(err));
...从......开始......
def user_params
params.require(:user).permit(:name, :username, :other_option)
end
...它希望请求正文有一个对象:user
。