0

私はレールに不慣れで、景色に問題があるので、これが簡単な質問であるならすみません。ビュー内のhas_and_belongs_to_manyアソシエーションにどのように追加するのか疑問に思いました。

これが、次のモンゴイドドキュメントを含むモデルがある状況です。

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で調べましたが、私のシナリオに一致する完璧な例は見つかりませんでした。

ありがとう

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(「動的属性ベースのファインダー」の下)にあります。

これを機能させるには、明らかにその人の名前をフォームとともに送信する必要があります。これは、特定の人の空のフォームを生成するときに、事前に入力された非表示フィールドを追加することで実行できるはずです(formstaticとnested_formはわかりません)。けれど...)。また、これを少し保護することもできます(人が実際に見つかったかどうか、およびその人がプロジェクトにまだ属していないかどうかを確認してから追加してください...)

また、私は一般的にあなたの人やプロジェクトのキーとして名前フィールドを使用することをお勧めしませんが、それはあなた次第です。ただし、これを別の方法で実装し、ユーザーがリストからプロジェクトを選択できるようにするか、新しいプロジェクトを作成できるようにすることをお勧めします(たとえば、ユーザーがタイプミスをした場合はどうなりますか?)

于 2011-09-04T03:02:16.510 に答える