1

现在我的帖子模型 has_many :tags, :through => :tag_joins

当我添加标签时,在创建帖子时,会自动创建 tag_join 记录。

现在这是我想要完成的事情:在查看帖子的显示视图时,我希望能够添加一个新标签。

我试过@post.tag = Tag.new 没用(为 tag= 返回一个“nomethoderror”)

所以我试图弄清楚如何添加标签并仍然自动创建这些连接。

我正在使用 Accepts_nested_attributes 等。

更新:我最初询问如何在索引视图上执行此操作,但我已将其更改为显示视图 - 因为我希望它会更容易一些。

4

3 回答 3

1

你离@posts.tags = Tag.new. 这里有几种方法可以做到这一点;

@post.tags << Tag.create(params[:tag])
@post.tags.create params[:tag]

我看到了解决这个问题的几种方法。一种是使用hidden_​​field或使用标签的嵌套路由来通过带有标签表单的帖子的 id。然后你可以在控制器中使用它来检索帖子并使用类似于上面的语法。

虽然这可行,但问题是它有点难看..这意味着您的标签控制器将处理查找帖子(这不一定是错误的,但它不应该担心帖子。除非标签只能与帖子相关联,即)。

处理它的更优雅的方法是使您显示的表单成为 post 实例的表单,而不是标签。然后,您可以使用嵌套属性将标签创建为帖子的一部分。

于 2011-02-13T15:17:29.397 回答
0

查看关联(belongs_to、has_many 等)添加到模型的 build_xxx 或 create_xxx 方法。您需要通过帖子创建标签,以便导轨自动“连接”它。

于 2011-02-13T15:16:16.707 回答
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
于 2015-08-17T05:38:46.630 回答