ruby-on-rails – 如何显示相关记录子集的表单,其中一些还不存在
我有任务和用户.当用户完成任务时,我创建一个完成,其中有一个字段供用户指示他们花了多长时间.我需要一个表单,显示所有具有完成状态和time_spent属性的任务.在提交时,应更新已存在的完成,并应创建新的完成.如果可能的话,我想在Formtastic中这样做,但我会对基本的Rails 3解决方案感到满意.
class Completion < ActiveRecord::Base belongs_to :task belongs_to :user # attribute time_spent end class User < ActiveRecord::Base has_many :completions has_many :tasks,:through => :completions end class Task < ActiveRecord::Base belongs_to :milestone has_many :completions has_many :users,:through => :completions end 另一个方面是我想要显示一组特定任务,例如那些属于里程碑的任务.我应该在里程碑控制器上有一个表格发布到完成控制器吗? class Milestone < ActiveRecord::Base has_many :tasks has_many :completions,:through => :tasks end UPDATE 使这个问题与众不同的是,某些链接尚不存在,并且没有单一的模型可以嵌套链接.例如.使用Ryan Daigle的Nested Object Forms post)我已经以一种形式编写了这个工作来编辑用户的所有可能的完成,但我需要在一个表单中编辑可能的完成的子集.我是否需要创建一个冗余对象MilestoneCompletions,其中包含has_many Completions和belongs_to User? ActiveModel可以拥有多少? 解决方法
我终于解决了这个问题一个关键是
fields_for的集合参数.另一个是生成具有现有记录和新记录的集合.
所以在视图中,类似于: <%= form_for @user do |f| %> <table> <tr><th>Completed</th><th>Time spent</th><th>Task</th></tr> <%= f.fields_for :completions,available_completions_for_milestone(@user,@milestone) do |cf| %> <tr> <td><%= cf.check_box :status,{disabled: cf.object.persisted?},"done","unreported" %></td> <td><%= cf.text_field :time_spent_text %></td> <td><%= cf.object.task.description %></td> </tr> <%= cf.hidden_field :task_id %> <% end -%> 使用辅助方法: def available_completions_for_milestone(user,milestone) user_completions = user.completions.in_milestone(milestone) available = [] milestone.tasks.each do |t| c = user_completions.select{|c| c.task_id == t.id}.first if !c then # make it c = user.completions.build( task: t ) end available << c end available end 请注意,在视图中已经检查并禁用了DB中已有的完成,因此无法取消选中它们.未选中状态获取值“未报告”,用户模型可以过滤掉这些记录,以便它们不会进入数据库: has_many :completions accepts_nested_attributes_for :completions,:reject_if => proc { |attrs| attrs['status'] == 'unreported' } 我还必须在User模型上创建atments_attributes attr_accessible.如果您可以访问task_ids,则update将删除PUT之外的完成. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |