ruby-on-rails – 如何在Rails 3中使用Mongoid嵌入式资源创建嵌套表单?

我有一个食谱模型,其中嵌入了成分,使用Mongoid.
class Recipe
  include Mongoid::Document
  include Mongoid::Timestamps

  field :title,:type => String
  embeds_many :ingredients

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

  validates :title,:presence => true
end

class Ingredient
  include Mongoid::Document
  field :name,:type => String
  field :quantity,:type => String

  embedded_in :recipe,:inverse_of => :ingredients
end

我希望能够同时创建一个新配方,以及该食谱的相关成分,但我很难理解我将如何做到这一点.这是我到目前为止:

_form.html.erb – 在配方视图中使用

<%= form_for @recipe do |f| %>  
...
  <li>Title: <%= f.text_field :title %></li>

  <% f.fields_for :ingredients do |builder| %>
    <%= render "ingredient_fields",:f => builder %>
  <% end %>
...
<%= f.submit %>

_ingredient_fields.html.erb

<%= f.text_field :name %>

配方控制器

def new
  @recipe = Recipe.new
  @ingredient = @recipe.ingredients.build
end

def create
  @recipe = Recipe.new(params[:recipe])


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

成分控制器

def new
  @recipe = Recipe.find(params[:recipe_id])
  @ingredient = @recipe.ingredients.build
end

def create
  @recipe = Recipe.find(params[:recipe_id]) 
  @ingredient = @recipe.ingredients.build(params[:ingredient]) 
  # if @recipe.save 
end

这使得新成分形成,但成分没有领域.谁能给我任何关于我做错的指示?

解决方法

当您显示嵌套表单时,请尝试使用(注意等于):
<%= f.fields_for

而不仅仅是

<% f.fields_for

看到这个类似的question.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...