Mongoid has_one关系的嵌套属性

时间:2012-03-23 16:59:07

标签: ruby ruby-on-rails-3 mongoid

我正在尝试创建一个与客户端具有has_one关系的联系人。我是用嵌套属性做的。我正在“新”视图/控制器中正确构建联系人。当我去保存联系时,它告诉我必须存在联系。因此,由于某种原因,它没有创建联系。

错误:

Validation failed - Contact can't be blank.

PARAMS:

{
  "utf8"=>"✓",
  "authenticity_token"=>"ep6es356WY5dja7D7C5Kj8Qc0Yvuh3IN2Z1iGG08J7c=",
  "client"=>{
    "contact_attributes"=>{
      "first_name"=>"Scott",
      "last_name"=>"Baute"
    },
  "commit"=>"Create Client"
}

型号:

class Client
  include Mongoid::Document
  include Mongoid::Timestamps

  attr_accessible :role, :contact_id, :contact_attributes

  # Relationships
  belongs_to :firm, validate: true
  has_one :contact, validate: true, autosave: true

  # Matters is custom relationship
  has_many :client_roles

  # Nested Attr
  accepts_nested_attributes_for :contact

  validates :contact_id, presence: true

  # Fields
  field :contact_id
  field :test
end

class Contact
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::MultiParameterAttributes

  #Relationships
  belongs_to :client

  field :first_name
  field :last_name

end

控制器:

# GET /clients/new
# GET /clients/new.json
def new
  @client = current_firm.clients.new

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @client }
  end
end

# POST /clients
# POST /clients.json
def create
  @client = current_firm.clients.new(params[:client])

  respond_to do |format|
    if @client.save!
      format.html { redirect_to client_path(@client.contact.id), notice: 'Client was successfully created.' }
      format.json { render json: @client, status: :created, location: @client }
    else
      format.html { render action: "new" }
      format.json { render json: @client.errors, status: :unprocessable_entity }
    end
  end
end

查看:

- @client.build_contact unless @client_contact
= semantic_form_for @client, html: { class: "form-horizontal"} do |f|
  .control-group
    = render "contact_fields", f: builder    
  .form-actions
    = f.submit class: "btn btn-primary"

1 个答案:

答案 0 :(得分:0)

我认为您需要在客户端模型中删除对contact_id的引用。 has_one关联执行联系人中的foreign_key。不在你的客户端。因此,当您从客户端创建联系人时,您的联系人中只定义了一个client_id,而不是客户端中的contact_id。

所以删除行:

validates :contact_id, presence: true

# Fields
field :contact_id

在您的客户端模型中。

相关问题