现在我的帖子模型has_many:tags,:through => :tag_joins
当我添加标签时,在创建帖子时,会自动创建tag_join记录。
现在我正在尝试完成这项工作:在查看帖子的节目视图时,我希望能够添加新标签。
我试过@ post.tag = Tag.new不起作用(为tag =返回“nomethoderror”)
所以我试图找出如何添加标签并仍然自动创建这些连接。
我正在使用accepts_nested_attributes等。
更新:我最初询问如何在索引视图上执行此操作,但我已将其更改为show视图 - 因为我希望它更容易一些。
答案 0 :(得分:1)
你与@posts.tags = Tag.new
并不太远。这有几种方法可以做到;
@post.tags << Tag.create(params[:tag])
@post.tags.create params[:tag]
我看到了解决这个问题的几种方法。一种方法是使用hidden_field或使用标签的嵌套路由来传递带有标签形式的帖子的id。然后,您可以在控制器中使用它来检索帖子并使用类似于上面的语法。
虽然这样可行,但问题是它有点难看......这意味着你的标签控制器将处理找到一个帖子(这不一定是错的,但不应该担心帖子。除非标签只能与帖子相关联,即。)。
处理它的更优雅的方式是使你显示的表单成为post实例的表单,而不是标签。然后,您可以使用nested attributes创建标记作为帖子的一部分。
答案 1 :(得分:0)
查看关联(belongs_to,has_many等)add to the models的build_xxx或create_xxx方法。您需要通过帖子创建标记,以便自动“连接”它。
答案 2 :(得分:0)
这里的关键观察是.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