6

我正在使用嵌套属性,但字段未加载到我的视图中。有人知道我错过了什么吗?

导轨 3.1,红宝石 1.9.2

型号 1:

class Traditions::Material < ActiveRecord::Base
  has_one :material_asset, :dependent => :destroy
  validates_presence_of :title
  accepts_nested_attributes_for :material_asset
end

型号 2:

class Traditions::MaterialAsset < ActiveRecord::Base
  belongs_to :material
  has_attached_file :asset
  validates_attachment_presence :asset
end

查看(HAML):

= form_for @material, :html => {:class => 'form', :multipart => true} do |f|
    = errors_for @material

    .field
        = f.label :title
        = f.text_field :title

    .field
        = f.label :description
        = f.text_area :description, :rows => 5

    .field
        = f.fields_for :material_asset do |ma|
            = ma.label :asset
            = ma.file_field :asset

    .buttonrow
        = f.submit 'Save'

结果 HTML(部分):

<div class='field'></div>
<div class='buttonrow'>
  <input name="commit" type="submit" value="Save" />
</div>

在上面,div.field是空的。

4

3 回答 3

11

我从您的rails issue中偶然发现了这一点,这似乎没有在您的new操作中构建嵌套资源。

你在打电话给build_material_asset你的控制器吗?这可以解释为什么这些字段没有被渲染。如果嵌套对象是nil,则没有要为其呈现字段的对象。

尝试这样的事情:

class MaterialsController < ApplicationController
  def new
    @material = Traditions::Material.new
    @material.build_material_asset
  end
end
于 2011-05-22T09:34:21.213 回答
3

fields_for 有新的语法。

= fields_for :plan, @plan do |builder| ...

在控制器中(新动作):

@plan = Parent.plans.new

在这里阅读更多:http: //api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for

于 2012-07-15T17:55:27.653 回答
0

我无法检查,但是像这样?

- form_for @material, :html => {:class => 'form', :multipart => true} do |f|
    = errors_for @material

    #field
        = f.label :title
        = f.text_field :title

    #field
        = f.label :description
        = f.text_area :description, :rows => 5

    #field
        - f.fields_for :material_asset do |ma|
            = ma.label :asset
            = ma.file_field :asset

    .buttonrow
        = f.submit 'Save'

问题是你已经嵌套了=. 您应该使用-外部迭代。另外,你确定这.field有效吗?不应该是#field吗?

于 2011-05-22T04:58:59.530 回答