Помощник "fields_for" не работает - PullRequest
6 голосов
/ 22 мая 2011

Я использую вложенные атрибуты, но поля не загружены в моем представлении.Кто-то знает, что мне не хватает?

Рельсы 3.1, Ruby 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 пусто.

Ответы [ 3 ]

11 голосов
/ 22 мая 2011

Я наткнулся на это из вашей проблемы с рельсами , которая, похоже, не создает вложенный ресурс в вашем new действии.

Вы звоните build_material_asset в свой контроллер? Это может объяснить, почему поля не отображаются. Если вложенный объект - nil, то нет объекта для отображения полей.

Попробуйте что-то вроде этого:

class MaterialsController < ApplicationController
  def new
    @material = Traditions::Material.new
    @material.build_material_asset
  end
end
3 голосов
/ 15 июля 2012

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

0 голосов
/ 22 мая 2011

Я не могу проверить, но что-то вроде этого?

- 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?

...