Я пытаюсь создать веб-API, который позволяет создавать FriendShip
по электронной почте или по номеру phone_number.Rails web API throwing of error
class Api::FriendshipsController < Api::BaseController
respond_to :json
def create
friend = User.where("email = ? OR phone_number = ?", params[:emailOrPhone], params[:emailOrPhone]).first # create a friend by email or phone_number
if friend.valid? # check if the friend exists, if it does we create our new friendship
friendship = Friendship.new
friendship.user = current_user
friendship.friend = friend
if friendship.valid? # check if friendship is valid
friendship.save # if it is, we save and return a success JSON response
render json: {created: true}, status: 200
else # if it's not a valid friendship, we display a error JSON response
render json: {created: false}, status: 400
end
end
end
end
Вот моя FriendShip
модель
class Friendship < ActiveRecord::Base
belongs_to :user
belongs_to :friend, :class_name => "User"
validates_uniqueness_of :user_id, scope: :friend_id, :message => '%{friend_id} is already a friend'
validate :check_friend_and_user # prevent user trying to add him/herself as friend.
def check_friend_and_user
errors.add(:friend, "can't be the same as user") if user == friend
end
end
Всякий раз, когда уникальность Ограничить нарушается, ошибка missing interpolation argument :friend_id in "%{friend_id} is already a friend" ({:model=>"Friendship", :attribute=>"User", :value=>2} given)
с кодом ошибки 500
Как мне сделать это не сгенерирует ошибку, но вместо того, чтобы перейти к вернуть ответ «fail json» с кодом состояния 400
Я хочу, чтобы вызывающий агент этого API знал, что они пытаются добавить кого-то, кто уже является другом. Получение кода состояния 500
и куча html, похоже, однозначно не идентифицируют его. Поэтому я хотел бы выслать ошибку в виде JSON и статус 200