自动创建连接表记录,rails 3

时间:2011-02-13 15:07:19

标签: ruby-on-rails ruby ruby-on-rails-3

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

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

现在我正在尝试完成这项工作:在查看帖子的节目视图时,我希望能够添加新标签。

我试过@ post.tag = Tag.new不起作用(为tag =返回“nomethoderror”)

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

我正在使用accepts_nested_attributes等。

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

3 个答案:

答案 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