我正在尝试构建一个表单,允许用户在创建新项目时选择多个标签,而不允许用户创建新标签。
以下是我的模型设置方式:
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
或其他指令)
答案 0 :(得分:1)
那么,你坚持哪一部分?
对于UI方面,您可能会考虑所选的rails gem:
https://github.com/tsechingho/chosen-rails
它允许用户开始输入项目的名称,并帮助他们自动完成项目,类似于在Facebook中选择邮件收件人时所发生的情况。我认为您应该可以使用它来让用户选择多个标签。
答案 1 :(得分: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的内容,以了解更多信息。