2015-08-15 2 views
0

Я очень смущен. У меня есть приложение Rails, которое я использую как API. Я использую камень rack-cors, чтобы разрешить пересечение домена AJAX. Если я отправлю новую информацию о пользователе через консоль, пользователь будет создан отлично. Если я представить новый пользователь через Угловое приложение (API) или с помощью Postman я получаю ошибку:Rails `has_secure_password` не работает над API

{"success":false,"message":"Password can't be blank and Password is too short (minimum is 6 characters )"}

Однако если я оказать Params на моем User контроллера:

def create 
    @user = User.new(user_params) 
    render json: { user: @user, params: params } 
    return 
    respond_to do |format| 
    if @user.save 
    format.html { redirect_to @user, notice: 'User was successfully created.' } 
    format.json { render json: { success: true, user: @user } } 
    else 
    format.html { render :new } 
    format.json { render json: { success: false, message: @user.errors.full_messages.to_sentence }, status: :unprocessable_entity } 
    end 
end 

конца

я получаю password и password_confirmation ОК вроде как на скриншоте прикрепленного:

enter image description here

У меня проблема с pin-point проблемой has_secure_password. Если я удалю его, пользователь будет создан отлично, но я не получу шифрование паролей и всю его часть. Ее стоит отметить, что я использую Mongoid и добавили has_secure_password так:

class User 

    include Mongoid::Document 
    include Mongoid::Timestamps 
    include Mongoid::Enum 
    include ActiveModel::SecurePassword 
    ... 

Ее также важно заметить, что я использую свою собственную проверку подлинности, а не разрабатывать и т.д.

Что я упускаю ?

+0

Вы управляете параметрами password и password_confirmation в своем методе 'users_params'? См. Http://guides.rubyonrails.org/action_controller_overview.html#strong-parameters – max

+0

Также у вас есть оператор 'return' в середине действия вашего контроллера. Это означает, что функция будет завершена до того, как пользователь будет создан. Поскольку вы также вызываете render, вы также получите двойную ошибку рендеринга. Пожалуйста, очистите код и отредактируйте. – max

+0

«return» был только для того, чтобы я мог показать свойства 'params' и остановить остальную часть кода в контроллере для запуска. В основном для тестирования. И да, я включил «пароль» и «пароль_конфирмации» в 'user_params' – WagnerMatosUK

ответ

1

Убедитесь, что у вас есть белые параметры password и password_confirmation.

Также у вас был как визуальный, так и обратный вызов в середине действия вашего контроллера, что предотвратит его работу по назначению.

def create 
    @user = User.new(user_params) 
    respond_to do |format| 
    if @user.save 
    format.html { redirect_to @user, notice: 'User was successfully created.' } 
    format.json { render json: { success: true, user: @user } } 
    else 
    format.html { render :new } 
    format.json { render json: { success: false, message: @user.errors.full_messages.to_sentence }, status: :unprocessable_entity } 
    end 
end 

private 

def user_params 
    params.require(:user) 
     .allow(:first_name, :last_name, :email, :password, :password_confirmation, :accept) 
end 

На стороне записки - когда ресурс создан успешно, вы должны возвращать 201 CREATED status code и установить заголовок в LOCATION ответ на место недавно созданного ресурса:

if @user.save 
    format.json do 
    render json: { success: true, user: @user }, 
      status: :created, 
      location: user_url(@user) 

    end 
end 

Я обычно использую responders gem для этого, как набирать один и тот же шаблонный код для ответа на разные форматы, довольно утомительно.

+0

Как и в предыдущем комментарии, 'render json: {user: @user, params: params} return' был таким, чтобы я мог его протестировать. Я удалил его сейчас и все еще получаю те же ошибки. Благодарим за подсказку о драгоценных камнях и статус. – WagnerMatosUK

Смежные вопросы