这里的关键观察是 .new 和 .create 之间的区别。对于我的 Devour.space 应用程序,我遇到了同样的问题。如果您使用以下方法在内存中创建对象:
tag = @post.tags.new(tag_params)
tag.save
不会有 tag_joins 条目保存到数据库中。@post.tags 不会返回您的新标签。您必须在实例化时使用 .create ,否则关联将不会记录在 JOIN 表中:
tag = @post.tags.create(tag_params)
@post.tags.last # tag
在我的情况下,这需要改变我的创建操作处理请求和错误的方式:
has_many :deck_shares
has_many :decks, through: :deck_shares
....
deck = current_user.decks.new(deck_params)
if deck.save # Does not create entry in DeckShares table
render json: deck
else
render json: deck.errors, as: :unprocessable_entity
end
这变成了:
begin
deck = current_user.decks.create(deck_params) # creates DeckShare
rescue Exception => e
render json: e, as: :unprocessable_entity
end
render json: deck unless e