连接表的Rails嵌套属性将不会保存 [英] Rails nested Attributes of join table won't be saved
问题描述
联接模型的嵌套属性将不会保存.关系ID似乎丢失了.验证字段后,将添加以下错误消息:
Nested attributes of join model won't be saved. relation id's seems to be missing. The following error messages are added when the fields get validated:
* Assigned projects user can't be blank
* Assigned projects project can't be blank
提交的参数看起来像这样(<%= debug(params)%>)
The submitted params look like this ( <%= debug(params) %> )
--- !map:ActionController::Parameters
utf8: "\xE2\x9C\x93"
authenticity_token: HrF1NHrKNTdMMFwOvbYFjhJE1ltlKbuz2nsfBYYBswg=
project: !map:ActionController::Parameters
name: Peter Pan
assigned_projects_attributes: !map:ActiveSupport::HashWithIndifferentAccess
"0": !map:ActiveSupport::HashWithIndifferentAccess
position: Group Leader
currency: " Neverland Dollars"
commit: Add Project
action: create
controller: projects
我有3个模型,如下所示:
I have 3 models, as followed:
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 AssignedProject < ActiveRecord::Base
belongs_to :user, class_name: "User"
belongs_to :project, class_name: "Project"
attr_accessible :project_id, :user_id, :position, :project_attributes
accepts_nested_attributes_for :project
validates :user_id, presence: true
validates :project_id, presence: true
validates :position, presence: true
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, :creator_id, :currency :assigned_projects_attributes
accepts_nested_attributes_for :assigned_projects
validates :name, presence: true, length: { minimum: 3, maximum: 100 }
validates :currency, presence: true, length: { minimum: 1, maximum: 5 }
validates :creator_id, presence: true
end
因此每个用户都可以创建一个项目.他可以通过联接模型将任何用户添加到项目中. 每个项目都属于一个用户响应.创建者和has_many用户通过Assigned_projects
So each User can create a Project. He can add any User to the Project through the join model. Each Project belongs to a User resp. Creator and has_many user through assigned_projects
我想给项目的每个用户一个位置",应将其保存在联接模型中:Assigned_project:position
I want to give each user of a project a "position", which should be saved in the join model: assigned_project :position
Project控制器如下所示:
the Project controller looks like that:
class ProjectsController < ApplicationController
def new
@project = Project.new
@project.assigned_projects.build(user_id: current_user)
end
def create
@project = current_user.assigned_projects.build.build_project(params[:project])
@project.creator = current_user
if @project.save
redirect_to current_user
else
render 'new'
end
end
end
,project/new.html.erb表单如下所示:
and the project/new.html.erb form looks like that:
<%= form_for( @project ) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.fields_for :assigned_projects do |ff| %>
<%= ff.label :position %>
<%= ff.text_field :position%>
<% end %>
<%= f.label :currency %>
<%= f.text_field :currency %>
<%= f.submit "Add Project", class: "" %>
<% end %>
更新:当前控制器&查看
def create
@project = Project.new(params[:project])
if @project.save
redirect_to current_user
else
render 'new'
end
end
<%= form_for( @project ) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.hidden_field :creator_id, value: current_user.id %>
<%= f.fields_for :assigned_projects, @project.assigned_projects do |ff| %>
<%= ff.label :position %>
<%= ff.text_field :position%>
<% end %>
<%= f.label :currency %>
<%= f.text_field :currency %>
<%= f.submit "Add Project", class: "" %>
<% end %>
推荐答案
问题可以通过删除联接表"AssignedProject"中对project_id和user_id的验证来解决.
Problem is solved by removing the validations for project_id and user_id in the join table "AssignedProject"
所以联接模型如下:
# Join Model AssignedProject
class AssignedProject < ActiveRecord::Base
belongs_to :user#, class_name: "User"
belongs_to :project#, class_name: "Project"
attr_accessible :project_id, :user_id, :position, :project, :project_attributes
accepts_nested_attributes_for :project
validates :position, presence: { message: " can't be blank." }
end
New和Create方法如下所示:
The New and Create methods look like that:
# Projects Controller
class ProjectsController < ApplicationController
def new
@project = Project.new
@project.assigned_projects.build(user_id: current_user)
end
def create
@project = Project.new(params[:project])
if @project.save
@project.assigned_projects.create(user_id: current_user)
redirect_to current_user
else
render 'new'
end
end
end
新方法的视图中的表单如下所示:
And the form in the view for the new method looks like that:
<%= form_for( @project ) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.hidden_field :creator_id, value: current_user.id %>
<%= f.fields_for :assigned_projects, @project.assigned_projects do |ff| %>
<%= ff.hidden_field :project_id, value: @project %>
<%= ff.hidden_field :user_id, value: current_user.id %>
<%= ff.label :position %>
<%= ff.text_field :position%>
<% end %>
<%= f.label :currency %>
<%= f.text_field :currency %>
<%= f.submit "Add Project", class: "" %>
<% end %>
这篇关于连接表的Rails嵌套属性将不会保存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!