Помощник fields_for не работает

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

Rails 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

Вид (ХАМЛ):

= 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 пусто.


person Edison Machado    schedule 22.05.2011    source источник
comment
Примечание: вам не нужно указывать multipart true в Rails 3.1. Он автоматически добавляется, когда в вашей форме есть поле файла.   -  person Vijay Dev    schedule 22.05.2011
comment
Это так здорово. Спасибо за совет! :)   -  person Edison Machado    schedule 22.05.2011


Ответы (3)


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

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

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

class MaterialsController < ApplicationController
  def new
    @material = Traditions::Material.new
    @material.build_material_asset
  end
end
person theTRON    schedule 22.05.2011
comment
Это определенно звучит как наиболее вероятный случай. - person Ryan Bigg; 22.05.2011
comment
Здорово! Я использовал частичную форму на дополнительной странице на своем веб-сайте, но поля fields_for отсутствовали, и это совершенно меня сбивало с толку ......, пока я не нашел эту тему. Проблема решена, спасибо. - person LondonGuy; 25.01.2013
comment
Ранее добавлено как правка с опечатками, но для справки я снова помещаю это здесь: при использовании has_many вы должны построить экземпляр, используя @material.material_assets.build - person Koen.; 04.04.2016

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

person Davidslv    schedule 15.07.2012
comment
На кой черт мне минусовать, если я даю достоверную информацию? - person Davidslv; 16.07.2012

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

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

person sawa    schedule 22.05.2011
comment
= верно, вы можете увидеть здесь: api.rubyonrails .org/classes/ActionView/Helpers/ Но я думаю, что это не имеет значения. Во всяком случае, я проверил оба и все еще не работает. - person Edison Machado; 22.05.2011
comment
Ваша ссылка для erb, но вы пишете в haml. Вы действительно получаете результат, который вы опубликовали? - person sawa; 22.05.2011
comment
Ага, слишком странно, именно это - person Edison Machado; 22.05.2011
comment
f.fields_for :material_asset возвращает 0 объектов, не зацикливается. - person Edison Machado; 22.05.2011