加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何使用accepts_nested_attributes_for?

发布时间:2020-12-17 03:11:54 所属栏目:百科 来源:网络整理
导读:编辑我的问题以简明扼要并更新我所做的事情: 如何为公司建立多个地址并为联系人分配单个地址,并在创建或编辑联系人时分配这些地址? 我想使用嵌套属性来创建新联系人时添加地址.该地址作为自己的模型存在,因为我可能希望选项从现有地址下拉而不是从头开始.
编辑我的问题以简明扼要并更新我所做的事情:

如何为公司建立多个地址并为联系人分配单个地址,并在创建或编辑联系人时分配这些地址?

我想使用嵌套属性来创建新联系人时添加地址.该地址作为自己的模型存在,因为我可能希望选项从现有地址下拉而不是从头开始.

我似乎无法让它发挥作用.我得到一个未定义的方法`build’为nil:NilClass错误

这是我的联系人模型:

class Contact < ActiveRecord::Base
  attr_accessible :first_name,:last_name,:title,:phone,:fax,:email,:company,:date_entered,:campaign_id,:company_name,:address_id,:address_attributes

  belongs_to :company
  belongs_to :address
  accepts_nested_attributes_for :address
end

这是我的地址模型:

class Address < ActiveRecord::Base
  attr_accessible :street1,:street2,:city,:state,:zip

  has_many :contacts
end

我想在创建新联系人时,访问属于公司其他联系人的所有地址.以下是我代表公司的方式:

class Company < ActiveRecord::Base
  attr_accessible :name,:addresses

  has_many :contacts

  has_many :addresses,:through => :contacts

end

以下是我在View for _form for Contact中创建字段的方法,以便当有人创建新的Contact时,他们将地址传递给Address模型并将该地址与Contact联系起来:

<% f.fields_for :address,@contact.address do |builder| %>
  <p>
    <%= builder.label :street1,"Street 1" %> </br> 
    <%= builder.text_field :street1 %>
  <p>
  <% end %>

当我尝试编辑时,Street 1的字段为空白.我不知道如何显示show.html.erb中的值.

在底部是我的错误控制台 – 似乎无法在地址表中创建值:

我的联系人控制器如下:

def new
    @contact = Contact.new
    @contact.address.build # Iundefined method `build' for nil:NilClass

    @contact.date_entered = Date.today
    @campaigns = Campaign.find(:all,:order => "name")
    if params[:campaign_id].blank? 

    else
      @campaign = Campaign.find(params[:campaign_id])
      @contact.campaign_id = @campaign.id
    end

    if params[:company_id].blank?

    else
      @company = Company.find(params[:company_id])
      @contact.company_name = @company.name
    end

  end

  def create
    @contact = Contact.new(params[:contact])
    if @contact.save
      flash[:notice] = "Successfully created contact."
      redirect_to @contact
    else
      render :action => 'new'
    end
  end

  def edit
    @contact = Contact.find(params[:id])
    @campaigns = Campaign.find(:all,:order => "name")
  end

这是我的错误控制台的片段:
我正在POST属性,但它不是在地址表中创建….

Processing ContactsController#create
(for 127.0.0.1 at 2010-05-12 21:16:17)

[POST] Parameters:
{“commit”=>”Submit”,
“authenticity_token”=>”d8/gx0zy0Vgg6ghfcbAYL0YtGjYIUC2b1aG+dDKjuSs=”,
“contact”=>{“company_name”=>”Allyforce”,
“title”=>””,“campaign_id”=>”2”,
“address_attributes”=>{“street1″=>”abc”},
“fax”=>””,“phone”=>””,
“last_name”=>””,
“date_entered”=>”2010-05-12”,
“email”=>””,“first_name”=>”abc”}}

Company Load (0.0ms)[0m [0mSELECT
* FROM “companies” WHERE (“companies”.”name” = ‘Allyforce’)
LIMIT 1[0m

Address Create (16.0ms)[0m
[0;1mINSERT INTO “addresses” (“city”,
“zip”,“created_at”,“street1”,
“updated_at”,“street2”,“state”)
VALUES(NULL,NULL,‘2010-05-13
04:16:18’,NULL)[0m

Contact Create (0.0ms)[0m
[0mINSERT INTO “contacts” (“company”,
“created_at”,“title”,“updated_at”,
“campaign_id”,“address_id”,
“last_name”,“phone”,“fax”,
“company_id”,“date_entered”,
“first_name”,“email”) VALUES(NULL,
‘2010-05-13 04:16:18’,”,2,5,
‘2010-05-12’,‘abc’,”)[0m

解决方法

只是一个平庸的问题,如果你在联系表格中使用这个问题,不应该单独说明吗?

<% f.fields_for :address,@contact.address do |builder| %>
   <p>
     <%= builder.label :street1,"Street 1" %> </br> 
     <%= builder.text_field :street1 %>
   <p>
 <% end %>

在你的行动中你也必须这样做

@ycontact.build_address

如果您查看源代码,您的输入字段应该是这样的.

< input type=”text” size=”30″
name=”contact[address_attributes][street1]”
id=”contact_address_attributes_street1″>

如果您将address_id存储在联系人中,我认为您的关联也存在问题

class Contact < ActiveRecord::Base
  belongs_to :address
  accepts_nested_attributes_for :address
end

class Address < ActiveRecord::Base
  attr_accessible :street1
  has_many :contacts
end

我认为这是你的情况,因为你想为多个联系人分配一个地址.

如果将contact_id存储在地址模型中,也可以反向执行:

class Contact < ActiveRecord::Base
  has_one :address
  accepts_nested_attributes_for :address
end

class Address < ActiveRecord::Base
  attr_accessible :street1
  belongs_to :contact
end

在这种情况下,您不能拥有相同地址的用户.

更新

在您的用户show.html.eb中,您可以使用

<%= @contact.address.street1 %>

在您公司的show.html.erb中,您可以显示以下地址:

<% @company.addresses.each do |address| %>
  <%= address.street1 %>
  ...
<% end %>

在您的用户编辑页面上,表单字段应与new.html.erb中的相同,只是表单标记应如下所示:

<% form_for @contact do |form| %>
  <%=render :partial=>'fields' %>
<% end %>

字段部分包含所有你的fieds togheter与:

<% f.fields_for :address,"Street 1" %> </br> 
     <%= builder.text_field :street1 %>
   <p>
 <% end %>

这应该工作.

更新2

您可以访问属于公司的所有地址:

@company.addresses

如果你有

class Company<Activerecord::Base
    has_many :contacts
    has_many :addresses,:through=>:contacts
end

关于草稿或默认地址.您可以根据需要选择不同的选项.我想要一个联系人可以从数据库中选择一个现有地址的选项.您可以在联系表单中选择一个选择框,如:

<%= form.select :address_id,options_from_collection_for_select(@company.addresses,'id','street1')%>

此外,您可以使用一些花哨的JavaScript来添加或删除地址表单,在这种情况下,如果用户选择一个现有地址.在这种情况下,您必须从表单中删除address_attributes.我建议用javascript代码创建一个链接,添加address_attributes并删除(切换样式).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读