Rails `has_secure_password` не работает через API

0

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

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

Однако, если я выдаю параметры на моем 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 нормально, как в прилагаемом скриншоте:

Изображение 174551

Я указал проблему на метод 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 ? Смотрите guides.rubyonrails.org/…
  • 0
    Также у вас есть оператор return в середине действия вашего контроллера. Это означает, что функция выйдет до того, как пользователь действительно будет создан. Поскольку вы также вызываете рендер, вы также получите двойную ошибку рендера. Пожалуйста, очистите код и отредактируйте.
Показать ещё 2 комментария

1 ответ

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 и установить заголовок ответа LOCATION в местоположение вновь созданного ресурса:

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

  end
end

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню