0

我是 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

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

我想要的与此类似(在 HAML 中):

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

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

我在 formtastic 和 nested_form 上查找了一些东西,但没有看到与我的场景相匹配的完美示例。

谢谢

4

1 回答 1

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找到(在“Dynamic Attribute-based Finders”下)

您显然必须将此人的姓名与表单一起发送才能工作,您应该能够通过在为特定人生成空表单时添加一个预填充的隐藏字段来做到这一点(我不知道 formstatic 和 nested_form尽管...)。您可能还想稍微保护一下(检查是否真的找到了一个人,以及该人是否在添加之前不属于该项目......)

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

于 2011-09-04T03:02:16.510 回答