2

我正在尝试构建一个表单,允许用户在创建新项目时选择多个标签,而不允许用户创建新标签。

这是我的模型的设置方式:

Item
has_many :item_labels
has_many :labels, :through => :item_labels

ItemLabel
belongs_to :item
belongs_to :label

Label
has_many :item_labels
has_many :items, :through => :item_labels

有什么想法可以在不允许用户创建新标签的情况下在表单中创建这种关系吗?(标签创建仅由管理员完成。)

具体来说,我应该如何在视图中设置表单,我应该对我的模型进行任何更改吗?(accepts_nested_parameters或其他指令)

4

2 回答 2

1

好吧,你坚持哪一部分?

对于 UI 方面,您可以考虑使用 selected-rails gem:

https://github.com/tsechingho/chosen-rails

它让用户只需开始输入项目的名称并帮助他们自动完成它,类似于在 Facebook 中选择消息的收件人时发生的情况。我认为您应该能够使用它来让用户选择多个标签。

于 2013-11-14T19:19:46.277 回答
1

我认为你不需要accepts_nested_attributes这个。我还没有尝试过所有这些,所以 YMMV :)

以下是在控制器中设置新项目的方法。我也在设置一个@labels实例变量,因为我将collection_select在视图中使用它:

# items_controller.rb
class ItemsController < ApplicationController
  def index
    @items = Item.all
  end

  def new
    @item = Item.new
    @labels = Label.all
  end

  def create
    @item = Item.new(params[:item])

    if @item.save
      flash[:info] = 'Item successfully created.'
      redirect_to items_path
    else
      @labels = Label.all
      render :new
    end
  end
end

假设您的Label模型有一个name属性,您的表单可能如下所示:

# new.html.erb
<%= form_form @item do |f| %>
  <!-- Other item fields go here -->

  <%= f.label :label_ids %>
  <%= f.collection_select :label_ids, @labels, :id, :name, {}, multiple: true %>

  <%= f.submit %>
<% end %>

您可以阅读有关collection_select的更多信息以了解更多信息。

于 2013-11-14T19:43:26.963 回答