1

Rails 3.1.RC4 で作成している単純なプロジェクト + タスク アプリケーションがあります。プロジェクト名、タスクがあり、各タスクは人に割り当てられます。プロジェクト フォームは単純で、(1) タスク名と (2) タスクと担当者の 2 つのボックスのみです。バックエンドでは、タスクと担当者を解析し、それらすべてを適切なモデルに入れたいと考えています。

サンプル入力

プロジェクト名:ピップの誕生日パーティー

タスク、担当者:

  • きれいなバスルーム、ジョン
  • シャインシューズ、サリー
  • ケーキを焼いて、ピーター
  • シャンパンを買う、スーザン

次の 4 つのモデルがあります。

    class Project < ActiveRecord::Base
      has_many :tasks
      has_many :assignments, :through => :tasks
      has_many :people, :through => :assignments
      attr_writer :task_text
      after_save :assign_tasks
    
      def task_text
        @task_text || tasks.map(&:name).join(' ')
      end
    
      private
    
      def assign_tasks
        if @task_text
          self.tasks = @task_text.split(/\n/).map do |line|
            assignment = line.split(',').first
            assignee = line.split(',').last
            Task.find_or_create_by_name(assignment)
            Task.people.find_or_create_by_name(assignee)
          end
        end
      end
    end
    
    class Task < ActiveRecord::Base
      attr_accessible :name
      belongs_to :project
      has_many :assignments
      has_many :peoples, :through => :assignments
    end
    
    class Assignment < ActiveRecord::Base
      belongs_to :tasks
      belongs_to :peoples
    end
    
    class People < ActiveRecord::Base
      has_many :assignments
      has_many :tasks, :through => :assignments
    end
    

ここに 1 つの形式のパーシャルがあります。

    <%= form_for @project do |f| %>
      <%= f.error_messages %>
      <p>
        <%= f.label :name %><br />
        <%= f.text_field :name %>
      </p>
      <p>
        <%= f.label :task_text, "Tasks, assignees" %><br />
        <%= f.text_area :task_text %>
      </p>
      <p><%= f.submit %></p>
    <% end %>
    

現在、「人」に対して未定義のメソッドエラーが発生しています。

多対多モデル、仮想属性、およびネストされたモデルをカバーする Railscasts をレビューしましたが、飛躍することはできませんでした。Javascript を使用せずにこのタスクを実行する必要があります。

4

2 に答える 2

1

私はこれが古いことを知っていますが、「人々」はすでに複数形なので、そうすべきです

belongs_to :people
has_many :people

等..

于 2012-01-12T20:01:11.017 に答える
0

たぶんただ

task = Task.find_or_create_by_name(assignment)
task.peoples.find_or_create_by_name(assignee)
task

代わりに

Task.find_or_create_by_name(assignment)
Task.people.find_or_create_by_name(assignee)
于 2011-07-23T14:59:33.183 に答える