2017-02-20 24 views
2

Я довольно новичок в Rails, поэтому мне, вероятно, не хватает чего-то очевидного, но у меня очень тяжелое время, чтобы работать с has_secure_password bcrypt.Проблема с Rails и BCrypt has_secure_password

Я пытаюсь зарегистрировать пользователей с помощью вызова AJAX с аксиом из интерфейса React. Данные передаются правильно, и у меня нет проблем с 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"=>"[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) 

(Несмотря на оптимизм этой последней строки, пользователь не вошел в базу данных Кроме того, обратите внимание, что не хватает password информации во второй половине строки 3)

Вот моя модель пользователя:

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 столбец в моем столе. Любая помощь, диагностирующая ошибку, будет очень оценена.

Спасибо за чтение!

Edited добавить:

Создание пользователя в консоли рубинового работает отлично

+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 определения является лучшей практикой.

EDIT: Благодаря полезному другу, я понял, что проблема заключается в том, как я отправлял вызов 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.