Ruby on Rails当A拥有并属于多个B时创建A-B关系示例,反之亦然

xxhby3vn  于 2022-11-04  发布在  Ruby
关注(0)|答案(2)|浏览(101)

我有两个示例类:
第一个
如果我的理解正确的话,这意味着我最终可以拥有带有许多书籍的标签以及带有许多标签的书籍。
我在books/new页面上有一个多选下拉菜单,可以将这些标签发送到控制器,但我不知道一旦它们到达控制器后该怎么做。

<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”])放到create方法中,但是没有成功,我觉得我找错了对象。

iklwldmw

iklwldmw1#

如果要将已有的标签分配给新的图书,可以在窗体中使用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: []
)
crcmnpdw

crcmnpdw2#

您可以在Book模型中添加accepts_nested_attributes_for :tags。这样,当提交表单时,@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

相关问题