嵌套表单未显示

时间:2015-01-07 19:09:58

标签: ruby-on-rails ruby-on-rails-4 nested-forms

我的_form中有三个嵌套表单;成分,说明和营养。前两个工作正常,但营养不会显示任何形式。如果我将“营养”重命名为表单中显示的其他内容,但由于它是错误的名称,因此params无法正确发送,因此无效。我觉得这是一个小东西,我忽略了,但想得到任何人的投入。

recipe.rb 相关位

class Recipe < ActiveRecord::Base


  has_many :ingredients, dependent: :destroy
  validates :ingredients, presence: true

  has_many :instructions, dependent: :destroy
  validates :instructions, presence: true

  accepts_nested_attributes_for :ingredients, reject_if: :all_blank, allow_destroy: true
  accepts_nested_attributes_for :instructions, reject_if: :all_blank, allow_destroy: true

  has_one :nutrition, dependent: :destroy
  accepts_nested_attributes_for :nutrition

end

nutrition.rb

class Nutrition < ActiveRecord::Base
  belongs_to :recipe
end

ingredient.rb 用于与营养.rb进行比较

class Ingredient < ActiveRecord::Base
  belongs_to :recipe

  validates :name, presence: true
end

recipes_controller.rb

的相关部分
class RecipesController < ApplicationController

  # GET /recipes/new
  def new
    @recipe = Recipe.new
  end

  # POST /recipes
  def create
    @recipe = current_user.recipes.new(recipe_params)

    if @recipe.save
      @recipe.upvote_by current_user
      redirect_to @recipe, notice: 'Recipe was successfully created.'
    else
      render :new
    end
  end

  # PATCH/PUT /recipes/1
  def update
    if @recipe.update(recipe_params)
      redirect_to @recipe, notice: 'Recipe was successfully updated.'
    else
      render :edit
    end
  end

  private
    # Never trust parameters from the scary internet, only allow the white list through.
    def recipe_params
      params.require(:recipe).permit(:name, :description, :image, :url, :category_id, ingredients_attributes: [:id, :name, :_destroy], instructions_attributes: [:id, :body, :image, :_destroy], nutrition_attributes: [:id, :serves, :serving_size, :calories, :fat, :carbs, :fiber, :protein])
    end
end

_form.html.erb

<%= form_for @recipe, html: { multipart: true } do |f| %>
    <h3>Nutrition</h3>
  <div class="nutrition">
    <%= f.fields_for :nutrition do |n| %>
<%# if I rename :nutrition to anything else the fields show, it seems to not enter this at all with :nutrition %>
      <%= render 'nutrition_fields', f: n %>
    <% end %>
  </div>

  <h3>Ingredients</h3>
  <div class="ingredients">
    <%= f.fields_for :ingredients do |ingredient| %>
      <%= render 'ingredient_fields', f: ingredient %>
    <% end %>
    <div class="links">
      <%= link_to_add_association 'add ingredient', f, :ingredients  %>
    </div>
  </div>

  <h3>Instructions</h3>
  <div class="instructions">
    <%= f.fields_for :instructions do |instruction| %>
      <%= render 'instruction_fields', f: instruction %>
    <% end %>
    <div class="links">
      <%= link_to_add_association 'add step', f, :instructions  %>
    </div>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

_nutrition_fields.html.erb

<div class="nested-fields">
  <div class="field">
    <%= f.label "Serves" %><br>
    <%= f.text_field :serves %>
  </div>

    <div class="field">
    <%= f.label "Serving Size" %><br>
    <%= f.text_field :serving_size %>
  </div>

    <div class="field">
    <%= f.label "Calories" %><br>
    <%= f.text_field :calories %>
  </div>

    <div class="field">
    <%= f.label "Fat" %><br>
    <%= f.text_field :fat %>
  </div>

    <div class="field">
    <%= f.label "Total Carbohydrates" %><br>
    <%= f.text_field :carbs %>
  </div>

    <div class="field">
    <%= f.label "Fiber" %><br>
    <%= f.text_field :fiber %>
  </div>

    <div class="field">
    <%= f.label "Protein" %><br>
    <%= f.text_field :protein %>
  </div>
</div>

1 个答案:

答案 0 :(得分:1)

class RecipesController < ApplicationController

 # GET /recipes/new
 def new
   @recipe = Recipe.new
   @nutrition = @recipe.build_nutrition
 end

字段:

<%= f.fields_for :nutrition, @nutrition do |n| %>

您必须在控制器中构建关联,以便默认显示has_one fields_for。