У меня есть модель матча с 2 игроками поля, которые имеют belongs_to ассоциацию с моделью пользователяСоздание/обновление ресурсов через Rails 5 API с ассоциацией
Модель
class Match < ApplicationRecord
belongs_to :player1, :class_name => 'User', :foreign_key => 'player1'
belongs_to :player2, :class_name => 'User', :foreign_key => 'player2'
end
При создании матча через API (используя запрос Postman POST) Я попытался передать user_id из игроков, но получил ошибку TypeMismatch, указав, что контроллер ожидает объект User, но получил Fixnum.
Глядя на этой линии:
@match = Match.new(match_params)
ошибка имеет смысл, поэтому я изменил мой умолчанию подмости генерироваться контроллеры выглядеть вместо этого:
def create
@match = Match.new
@match.player1 = User.find(params[:match][:player1])
@match.player2 = User.find(params[:match][:player2])
if @match.save
render json: @match, status: :created, location: @match
else
render json: @match.errors, status: :unprocessable_entity
end
end
# PATCH/PUT /matches/1
def update
if @match.update(:player1 => User.find(params[:match][:player1]),
:player2 => User.find(params[:match][:player2])
)
render json: @match
else
render json: @match.errors, status: :unprocessable_entity
end
end
Он работает, но решение кажется " безвкусный». Есть ли лучший способ передать значения контроллеру с ассоциацией belongs_to?
И, конечно, пожалуйста ** обновите параметры, переданные из представлений на контроллер **, возможно, player1 на player1_id, player2 на player2_id. –
Так очевидно в ретроспективе Спасибо, это отлично работало с конструкцией match_params по умолчанию – Augusto