连接表的Rails嵌套属性将不会保存 [英] Rails nested Attributes of join table won't be saved

查看:112
本文介绍了连接表的Rails嵌套属性将不会保存的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

联接模型的嵌套属性将不会保存.关系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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆