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

ruby-on-rails – rails fields_for和嵌套属性

发布时间:2020-12-17 03:23:25 所属栏目:百科 来源:网络整理
导读:我很难理解如何使用fields_for和嵌套属性.为了更好地理解它,我创建了一个 repo,这是行不通的. 我读了this,这没什么用. 我在用: Rails 4.0.1 Ruby 2.0.0-p247 题: 地址表单显示,为什么无法保存到数据库? 为什么不工作? jack = Person.create(姓名:’杰克
我很难理解如何使用fields_for和嵌套属性.为了更好地理解它,我创建了一个 repo,这是行不通的.

我读了this,这没什么用.

我在用:

Rails 4.0.1
Ruby 2.0.0-p247

题:

>地址表单显示,为什么无法保存到数据库?
>为什么不工作?

jack = Person.create(姓名:’杰克’)

jack.address.create(街道:’12w 33st’)

主要功能如下:

#model
class Person < ActiveRecord::Base
  has_one :address
  accepts_nested_attributes_for :address
end

class Address < ActiveRecord::Base
  belongs_to :person
end

查看如下:

<%= form_for(@person) do |f| %>
  <% if @person.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@person.errors.count,"error") %> prohibited this person from being saved:</h2>

      <ul>
      <% @person.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :age %><br>
    <%= f.text_field :age %>
  </div>
  <div class="field">
    <%= f.label :gender %><br>
    <%= f.text_field :gender %>
  </div>
  <%= fields_for :address do |address_fields|%>
    Street:
    <%= address_fields.text_field :street%>
    Zip code:
    <%= address_fields.text_field :zip_code%>
  <% end %>  
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

nested attributes

结论:

> has_one关系不支持person.address.create.这只适用于has_many
> rails api for fields_for,真的不太清楚.它只是缺少整个控制器部分.跟着它不会成功.

解决方法

尝试:

jack = Person.create(name: 'Jack')
jack.create_address(street: '12w 33st')

当只有一个关联地址(has_one:address)时,使用create_address.当有许多关联地址(has_many:地址)时,您使用addresses.create.

此外,在您的视图中,您将需要f.fields_for而不是fields_for.

我建议查看RailsCasts for Nested Model Form以了解更多信息.

附加信息(以解决以下评论)

另请注意,create将生成一个新对象并尝试将其保存在数据库中. build将只构建新对象.在你的PeopleController中,你需要这样的东西:

def new
  @person = Person.new
  @person.build_address
end

根据您的需要,您可以确定是否希望此构建在模型中的其他操作或回调中发生.但是,这将让你开始.

您还需要将person_params更新为

def person_params
  params.require(:person).permit(:name,:age,:gender,address_attributes: [:id,:street,:zip_code])
end

(编辑:李大同)

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

    推荐文章
      热点阅读