【发布时间】:2014-04-30 21:53:53
【问题描述】:
我有两个问题:
-我坚持创建一个项目,其中包含 :position 的嵌套属性
-我几乎可以使用它来编辑项目详细信息以及 :position 属性,但是 fields_for :assigned_projects 会为分配给该项目的所有用户广告所有字段。
我有 3 个模型:
class User < ActiveRecord::Base
has_many :assigned_projects
has_many :projects, :through => :assigned_projects
has_many :created_projects, :class_name => "Project", :foreign_key => :creator_id
end
class Project < ActiveRecord::Base
belongs_to :user
has_many :assigned_projects
has_many :users, :through => :assigned_projects
belongs_to :creator, :class_name => "User", :foreign_key => :creator_id
attr_accessible :name, :controlled, :currency, :creator_id, :assigned_projects
accepts_nested_attributes_for :assigned_projects#, :allow_destroy => true
end
class AssignedProject < ActiveRecord::Base
belongs_to :user, class_name: "User"
belongs_to :project, class_name: "Project"
attr_accessible :project_id, :user_id, :position, :project, :user, :user_attributes
accepts_nested_attributes_for :user
end
每个用户都可以创建一个项目并且是 Projects.creator 每个Project通过join模型Assigned_Project拥有_many Users
每个用户在项目中可以有不同的位置,所以我想将 :position 保存在连接模型 AssignedProject 中。
如果用户创建了一个项目,他应该能够编辑项目属性以及新连接模型的 :position 属性。
现在是 New.Project 和 Edit.Project 的表单字段
/project/new.htm.erb
<%= form_for( setup_new_project(@project) ) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.fields_for :assigned_projects do |ff| %>
<%= ff.label :position %>
<%= ff.text_field :position%>
<% end %>
<%= f.submit "Add Project", class: "" %>
<% end %>
/project/edit.htm.erb
<%= form_for( setup_project(current_project) ) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.fields_for :assigned_projects do |ff| %>
<%= ff.label :position %>
<%= ff.text_field :position%>
<% end %>
<%= f.submit "Update Project", class: "" %>
<% end %>
并且我有本文所述的以下设置方法: http://www.sitepoint.com/complex-rails-forms-with-nested-attributes/
module FormHelper
def setup_project(project)
project.assigned_projects ||= AssignedProject.new
project
end
def setup_new_project(project)
project.assigned_project = AssignedProject.new
project
end
end
我希望问题足够清楚。
对于创建一个新项目,当前的错误信息是:
undefined method `assigned_project='
15: <%= render 'shared/user_sidebar_menu' %>
16:
17: <div class="span4 offset1">
18: <%= form_for( setup_new_project(@project) ) do |f| %>
19:
20: <%= render 'shared/error_messages', object: f.object %>
21:
更新:添加了 projects_controller.rb
projects_controller.rb
class ProjectsController < ApplicationController
def new
@project = Project.new
end
def create
@project = Project.new(params[:project])
@project.creator = current_user
if @project.save
current_user.assigned_projects.create(project: @project)
redirect_to current_user
else
render 'new'
end
end
end
【问题讨论】:
标签: ruby-on-rails many-to-many nested-attributes