2017-02-20 78 views
2

我對Rails很新,所以我可能錯過了一些顯而易見的事情,但是我非常難以讓bcrypt的has_secure_password工作。Rails和BCrypt的問題has_secure_password

我正在嘗試通過來自React前端的axios AJAX調用來註冊用戶。數據正確傳入並且我沒有任何CORS問題,因爲當我刪除has_secure_password行(並且在所有適用的位置用:password_digest替換:password)時,用戶被輸入數據庫 - 只是沒有加密密碼。我已經通過一堆以前的問題排序& 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"=>"[email protected]", "password"=>"[FILTERED]", "user"=>{"name"=>"test", "username"=>"test25", "email"=>"[email protected]"}} 
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

嘗試轉到Rails控制檯並使用user = User.create在那裏創建一個新用戶。如果失敗,請鍵入user.errors.full_messages以查看失敗的位置。 – DevJem

+0

@Dithanial在rails控制檯中創建它實際上沒有問題。仍然不支持AJAX調用。我用'user.errors.full_messages'更新了控制器的錯誤響應,而不是'有錯誤',並且得到了「密碼不能爲空」。 – JSilv

+0

BCrypt需要密碼確認嗎? –

回答

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 

我還是想知道爲什麼發生,因爲它看起來很奇怪&違反直覺的行爲和我想象具有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