簡體   English   中英

自動創建聯接表記錄,rails 3

[英]Create join table record automatically, rails 3

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

添加標簽時,在創建帖子時,將自動創建tag_join記錄。

現在,這是我要完成的任務:在查看帖子的顯示視圖時,我希望能夠添加一個新標簽。

我嘗試了@ post.tag = Tag.new不起作用(返回tag =的“ nomethoderror”)

因此,我試圖弄清楚如何添加標簽並仍然自動創建這些聯接。

我正在使用accepts_nested_attributes等。

更新:我最初詢問如何在索引視圖上執行此操作,但是我已將其更改為顯示視圖-因為我希望它會更容易一些。

@posts.tags = Tag.new距離您不太遠。 這有兩種方法可以實現:

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

我看到了幾種解決此問題的方法。一種方法是使用hidden_​​field或使用嵌套的標記路由通過帶有標記形式的帖子ID。 然后,您可以在控制器中使用它來檢索帖子,並使用與上面類似的語法。

盡管這行得通,但問題是它有點丑陋。這意味着您的標簽控制器將處理找到帖子的問題(這不一定是錯誤的,但不必擔心帖子。除非標簽只能與帖子相關聯)。

處理它的更合適的方法是使您顯示的表單成為post實例的表單,而不是標簽。 然后,您可以使用嵌套屬性在帖子中創建標簽。

這里的主要觀察是.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

在我的情況下,這需要更改我的create動作處理請求和錯誤的方式:

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

看一下關聯(belongs_to,has_many等) 添加到模型中的build_xxx或create_xxx方法。 您需要通過帖子創建標簽,以使rails自動“連接”它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM