Я очень смущен. У меня есть приложение 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
нормально, как в прилагаемом скриншоте:
Я указал проблему на метод has_secure_password
. Если я удалю его, пользователь будет создан отлично, но я не получу шифрование паролей и всю его часть. Стоит отметить, что я использую Mongoid и добавил has_secure_password
:
class User
include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::Enum
include ActiveModel::SecurePassword
...
Важно также отметить, что я использую свою собственную проверку подлинности, а не программу и т.д.
Что мне не хватает?
Убедитесь, что вы указали параметры 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
Обычно я использую для этого камни-ответчики, поскольку печатать один и тот же код шаблона для ответа на разные форматы довольно утомительно.
render json: { user: @user, params: params } return
был таким, чтобы я мог его протестировать. Я удалил это сейчас и все еще получаю те же ошибки. Спасибо за ответ жемчужина чаевые и статус, хотя.
users_params
? Смотрите guides.rubyonrails.org/…return
в середине действия вашего контроллера. Это означает, что функция выйдет до того, как пользователь действительно будет создан. Поскольку вы также вызываете рендер, вы также получите двойную ошибку рендера. Пожалуйста, очистите код и отредактируйте.