Rails 4.0 и Cocoon: вложенные поля в fields_for не отображаются в Edit

Надеясь, что кто-то может предложить исправление здесь. Я новичок в Rails и изучаю изменения в Rails 4.0. Я создал это простое приложение книги рецептов в Rails 4.0. У меня есть основная модель для рецептов (название, cook_time, печь_temp, инструкции и т. д.). Поскольку в одних рецептах может быть 5 ингредиентов, а в других — 20, я хотел выделить ингредиенты в отдельную модель с ассоциацией has_many. Таким образом, рецепты имеют_много ингредиентов и принимают_вложенные_атрибуты_для:ингредиентов. Вот модели:

recipe.rb

class Recipe < ActiveRecord::Base
  belongs_to :user
  belongs_to :category
  has_many :ingredients, :dependent => :destroy

  validates :name, presence: true, length: { maximum: 50 }

  accepts_nested_attributes_for :ingredients, 
                :reject_if => lambda { |a| a[:name].blank? },
                            :allow_destroy => true
end

ингредиент.rb

class Ingredient < ActiveRecord::Base
  belongs_to :recipe
end

Напоминание: Rails 4.0 больше не использует attr_accessible, а перемещает присваивание в контроллер с сильными параметрами.

recipes_controller.rb

class RecipesController < ApplicationController
  before_action :find_recipe, only: [:show, :edit, :update, :destroy]
  before_action :set_current_user, except: [:index, :show]
  respond_to :html, :js

  ...

  def edit
  end

  def update
    if @recipe.update_attributes(recipe_params)
      redirect_to @recipe
    else
      render :edit
    end
  end

...

  def find_recipe
    @recipe = Recipe.find(params[:id])
  end

private

  def recipe_params
    params.require(:recipe).permit( :id, :name, :category_id, :cook_time, :oven_temp, :calories, :instructions, :notes, :email, ingredients_attributes: [:id, :name])
  end

end

Я использую отличный гем Cocoon от nathanvda для динамического управления вложенными полями формы, и он отлично работает в «recipes # new» и правильно сохраняет информацию. Однако поля ингредиентов не отображаются в представлении «рецепты#изменить»! Вот код для моих партиалов «форма» и «ингредиенты_поля».

_form.html.erb (сокращенно)

<%= form_for @recipe, html: { class: 'form-horizontal' } do |f| %>

  <fieldset>
  <legend>Main Information</legend>

    <div class="field form-group">
      <%= f.label :name, "Recipe name", class: "col-lg-2 control-label" %>
      <div class="col-lg-5">
        <%= f.text_field :name, class: "form-control" %>
      </div>
    </div>

    <div class="field form-group">
      <%= f.label :cook_time, class: "col-lg-2 control-label" %>
      <div class="col-lg-5">
        <%= f.text_field :cook_time, class: "form-control" %>
      </div>
    </div>
...
  </fieldset>

  <legend>Ingredients</legend>
  <p>Number of ingredients: <%= f.object.ingredients.count unless f.object.ingredients.nil? %></p>
  <fieldset id="ingredients">
    <% f.fields_for :ingredients do |builder| %>
      <%= render 'ingredient_fields', :f => builder %>
    <% end %>
    <p class="links">
      <%= link_to_add_association 'add ingredient', f, :ingredients, { class:"btn btn-primary" } %>
    </p>
  </fieldset>

  <fieldset>
  <legend>How to make it</legend>
  <div class="field form-group">
    <%= f.label :instructions, class: "col-lg-2 control-label" %>
      <div class="col-lg-5">
        <%= f.text_area :instructions, class: "form-control", rows: "7" %>
      </div>
    </div>
 ...
    </div>
  </fieldset>
<% end %>

_ingredients_fields.html.erb

<div class="nested-fields">
  <div class="form-group">
    <%= f.label :name, "Ingredient", class: "col-lg-2 control-label" %>
    <div class="col-lg-5">
      <%= f.text_field :name, class: "form-control" %>
    </div>
    <%= link_to_remove_association "remove", f %>
  </div>
</div>

Как я уже сказал, довольно просто, удалены все проверки ошибок и обмен сообщениями, только основы. Любые идеи о том, что мне не хватает? Я знаю, что в рецепте есть ингредиенты, когда загружаю редактирование из представления шоу. Спасибо заранее за любые советы!

Кевин


person user2670683    schedule 14.08.2013    source источник


Ответы (2)


Подтвердить это было так же просто, как знак '=' - должно быть, тысячу раз смотрел на ‹% f.fields_for... %> и просто не заметил, что я пропустил добавление ‹%=.

person user2670683    schedule 19.08.2013
comment
Я потратил часы на одну и ту же проблему. Рад, что ты это понял! - person Jeremy Becker; 20.01.2014

person    schedule
comment
Добро пожаловать в Stack Overflow! Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего поста. Помните, что вы отвечаете на вопрос для будущих читателей, и эти люди могут не знать причин вашего предложения кода. Также старайтесь не перегружать свой код пояснительными комментариями, это снижает читабельность как кода, так и пояснений! - person Suraj Rao; 19.07.2017