我有兩個示例類:
# book.rb
class Book < ApplicationRecord
has_and_belongs_to_many :tag
end
# tag.rb
class Tag < ApplicationRecord
has_and_belongs_to_many :book
end
如果我理解正確,這意味著我最終可以擁有帶有許多書籍的標簽和帶有許多標簽的書籍。現在,我想在創建書籍時為書籍分配標簽。
我在書籍/新頁面上有一個多選下拉選單,可將這些標簽發送到控制器,但我不知道一旦它們到達控制器該怎么做。
<div>
<%= form.label :tags, style: "display: block" %>
<%= select_tag :tags, options_from_collection_for_select(@tags, :id, :name), multiple: true, prompt: "Select Tags" %>
</div>
控制器如下所示:
def create
@Book = Book.new(book_params)
respond_to do |format|
if @book.save
format.html { redirect_to book_url(@book), notice: "Book was successfully created." }
format.json { render :show, status: :created, location: @book }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @book.errors, status: :unprocessable_entity }
end
end
end
當我使用表單制作一本書時,當我在 rails 控制臺中檢查最新一本書時,它沒有任何標簽。
我嘗試將 @book.tag.build(tag_ids: book_params["tags"]) 放入您的創建方法中,但這沒有用,我覺得我在叫錯樹。
uj5u.com熱心網友回復:
如果要將現有標簽分配給新書,可以select在表單中使用方法
<%= form.select :tag_ids, Tag.all.map { |p| [p.name, p.id] }, multiple: true, prompt: "Select Tags" %>
當然你可以@tags從控制器而不是Tag.all
如果您使用強引數,則需要在此處添加此引數,例如
params.require(:book).permit(
# existed params,
tag_ids: []
)
uj5u.com熱心網友回復:
您可以accepts_nested_attributes_for :tags在Book模型中添加。這樣,當提交表單時,@book.save將為來自的標簽創建關聯params[:books][:tags]
# book.rb
class Book < ApplicationRecord
has_and_belongs_to_many :tag
accepts_nested_attributes_for :tags
end
參考:https ://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/510040.html
標籤:轨道上的红宝石红宝石
上一篇:將多個陣列合并到一個哈希陣列中
下一篇:如何回傳我想要的結果陣列
