1

我在 Rails 3.1.RC4 中创建了简单的项目+任务应用程序。它将具有项目名称、任务,并且每个任务都将分配给一个人。项目表格很简单,只有两个框 (1) 任务名称和 (2) 任务和受让人。在后端,我想解析任务和受让人,并将它们全部放入正确的模型中。

样本输入

项目名称: Pip的生日派对

任务,受让人:

  • 干净的浴室,约翰
  • 擦鞋,莎莉
  • 烤蛋糕,彼得
  • 买香槟,苏珊

它有四种型号:

    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
    

这是一种形式的部分:

    <%= 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 %>
    

现在我收到“人”的未定义方法错误。

我已经回顾了涵盖多对多模型、虚拟属性和嵌套模型的 Railscast,但我还没有实现飞跃。我必须在没有 Javascript 的情况下完成这项任务。

4

2 回答 2

1

我知道这是旧的,但“人”已经是复数了,所以应该是

belongs_to :people
has_many :people

ETC..

于 2012-01-12T20:01:11.017 回答
0

Maybe just

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

insead of

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