如何在rails中保存包含另一个模型属性的模型?

Posted

技术标签:

【中文标题】如何在rails中保存包含另一个模型属性的模型?【英文标题】:How to save a model containing attributes of another model in rails? 【发布时间】:2017-10-14 21:29:14 【问题描述】:

在我的项目中,我有一个 Organization 模型和一个 Address 模型。以下是模型之间的关联:

class Organization < ApplicationRecord
    has_one :address
    accepts_nested_attributes_for :address
end

class Address < ApplicationRecord
    belongs_to :organization
end

我在我的新组织表单中添加了这样的地址属性(form_with 用于Organization 属性,fields_for 用于Address 属性):

<%= form_with(model: organization, local: true) do |form| %>

  <div class="field">
    <%= form.label :organizationName %>
    <%= form.text_field :organizationName, id: :organization_organizationName  %>
  </div>

  <div class="field">
    <%= form.label :email %>
    <%= form.text_field :email, id: :organization_courriel %>
  </div>

  <div class="field">
    <%= form.label :webSite %>
    <%= form.text_field :webSite, id: :organization_webSite %>
  </div>

  <%= fields_for :adresse, organization.address do |address_fields| %>
      Street number: <%=address_fields.text_field :streetNumber%><br>
      Street: <%=address_fields.text_field :street%><br>
      City: <%=address_fields.text_field :city%><br>
      Province: <%=address_fields.text_field :province%><br>
      Postal code: <%=address_fields.text_field :postalCode%><br>
  <% end %>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

当我试图用他的地址保存组织时,组织被保存但他的地址没有。

如何保存组织的地址?

这是我的组织控制器:

def new
    @organization = Organization.new
    @organization.build_address
end

def create
    @organization = Organization.new(organization_params)
    @organization.save
    //...
end

def organization_params
  params.require(:organization).permit(:organizationName, :email, :webSite, address_attributes:[:streetNumber, :street, :city, :province, :postalCode])
end

编辑

问题是我的观点。我的表单没有包含我的 field_for 部分。

解决方案:

<%=form.field_for :address do |address_fields| %>

【问题讨论】:

您使用的是哪个版本的导轨? Rails 版本 5.1.4 你拼错了ApplicationRecord。这是ActiveRecord::Base @Cyzanfar:你没用过 Rails 5,是吗? :) 还没有@SergioTulentsev!令人惊讶的是,他们让它变得更加简单:) 【参考方案1】:
 belongs_to :address, optional: true
params.require(:organization).permit(:name,address_attributes: [:id,:city])

【讨论】:

我希望每次都能在我的组织中保存地址。在我的情况下,地址不是可选的。 你能像Organization 对address 和address belongs_to organization 一样更改它吗? 我刚做了,我想我在这里做点什么:***.com/questions/34863818/… 您不允许使用地址属性。 我在控制器中更改了我的 organization_params 方法,但地址没有保存。同样的问题。

以上是关于如何在rails中保存包含另一个模型属性的模型?的主要内容,如果未能解决你的问题,请参考以下文章

Rails“多重继承”模型-具有另一个类的属性的ActiveRecord对象?

在另一个模型控制器中使用的 Rails 3 虚拟属性

Rails3:将一个数据库中的字段包含到另一个模型中

Rails:如何为 Rails activerecord 模型中的属性创建默认值? [复制]

Rails - 模型不通过方法保存属性,但如果手动分配(在控制台中)

根据另一个模型的属性 - RAILS,为一个模型使用不同的CarrierWave上传器