在多模型视图轨道中使用Has_and_belongs_to_many关联

时间:2011-09-04 01:11:29

标签: ruby-on-rails view has-and-belongs-to-many form-for multi-model-forms

我是rails的新手并且遇到问题,如果这是一个简单的问题,请原谅我。我想知道如何在视图中添加has_and_belongs_to_many关联。

以下是我有一个带有以下mongoid文档的模型的情况:

class Project
  include Mongoid::Document
  field :name, type: String
  key :name
  field :numPeople, type: Integer
  has_and_belongs_to_many :people
end

和...

class Person
  include Mongoid::Document
  field :name, type: String
  key :name
  field :numProjects, type: Integer, default: 0
  has_and_belongs_to_many :projects
end

我想要的是一个Person页面,它能够在文本字段中写入项目名称,如果项目存在,它会将他添加到项目中,如果它不存在,它将创建一个新项目他指定的名字。

我想要的是这个(在HAML中):

= form_for Project.new do |f|
    %p
        = f.text_field :name
        = f.submit "Add Project"

但我不想每次都创建一个新项目,因为该项目可能已经存在。

我查看了formtastic和nested_form上的内容,但没有看到与我的场景相匹配的完美示例。

由于

1 个答案:

答案 0 :(得分:0)

我是一个菜鸟,但我认为我可以提供帮助 - 不是为了观看部分,而是为了下面的逻辑。

您的PersonPagesController中似乎需要一个将在表单提交时调用的操作(承认您的表单发送了person_name和project_name),该操作应如下所示:

def add_person_to_project
  @person = Person.find(params[:person_name])
  @project = Project.find_or_create_by_name(params[:project_name])
  @project.persons << @person # or @person.projects << @project
end

有关find_or_create的信息可以在http://api.rubyonrails.org/classes/ActiveRecord/Base.html找到(在“基于动态属性的查找器”下)

你显然必须发送此人的姓名以及表格才能工作,你应该可以通过在为特定的人生成空表格时添加一个预先填写的隐藏字段来做(我不知道formstatic和nested_form虽然......)。您可能还想稍微确定一下(检查一个人是否真的找到了,如果那个人在添加之前还没有属于该项目......)

此外,我通常不建议使用名称字段作为您的人员和项目的关键,但这取决于您。不过,我建议您以另一种方式实现,让用户在列表中选择项目或创建一个新项目(例如,如果您的用户输入拼写错误会发生什么?)