嵌套与现有对象?

时间:2013-11-14 19:13:31

标签: ruby-on-rails ruby

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

以下是我的模型设置方式:

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或其他指令)

2 个答案:

答案 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的内容,以了解更多信息。