我正在Rails中制作一个食谱管理员(谁不是他们的第一个应用程序?),这是我的布局:
Ingredient belongs to Recipe
Recipe has many Ingredients
制作反映这种关系的表单的最佳方法是什么?我正在考虑一个输入,当一个填充时,创建另一个,所以在成分的形式的末尾总是“再多一个”。
一旦我制作了UI,模型和控制器的结构会是什么样子?现在我有脚手架控制器create
方法:
def create
@recipe = Recipe.new(params[:recipe])
respond_to do |format|
if @recipe.save
format.html { redirect_to(recipes_path, :notice => 'You made a new recipe!') }
format.xml { render :xml => @recipe, :status => :created, :location => @recipe }
else
format.html { render :action => "new" }
format.xml { render :xml => @recipe.errors, :status => :unprocessable_entity }
end
end
end
params[:recipe]
是否应该是一个更深层嵌套的对象/哈希/字典,它包含一系列成分或什么?
感谢您提供任何指导。
答案 0 :(得分:1)
只需用逗号分隔添加成分。
这可以是text_field_tag
,因为你需要解析它并用逗号保存每个单词并用之前保存。
class Recipie < ActiveRecord::Base
has_many :ingredients
before_save :add_ingredients
attr_accessor :ingredients_to_parse #this will be the text_field_tag
def add_ingredients
#create an array of ingredients from #ingredients_to_parse
#then loop through that array i.e. you have your ingredients_array
ingredients_array.each do
Ingredient.create(:recipe => self, :other_params => 'stuff')
end
#there are a lot of ways, I just used create to show you how to add it
end
end
然后在您的表单中只有text_field_tag
<%= form_for(@recipe) do |f| %>
<% f.text_field :name %>
<% text_field_tag :ingredients_to_parse %>
<%= f.submit %>
<% end %>
然后你可以添加Javascript,这样每次在text_field_tag
中添加一个逗号,你就可以使用一些js来制作这些花哨的东西。
这样,当服务器运行缓慢,js运行不正常等时,它将起作用。将HTML版本放在首位也是一个好主意。
祝你好运,如果你有疑问/问题,请告诉我。答案 1 :(得分:1)
您应该在这里使用accepts_nested_attributes
。
一些链接:
API:
http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for
截屏:
http://railscasts.com/episodes/196-nested-model-form-part-1
http://railscasts.com/episodes/197-nested-model-form-part-2
所以你的模型看起来像这样
class Recipie < ActiveRecord::Base
has_many :ingredients
accepts_nested_attributes_for :ingridients, :allow_destroy => true
end
查看:
<%= form_for @recipe do |f| %>
... # reciepe fields
<%= f.fields_for :ingridients do |i| %>
... # your ingridients forms
<% end %>
...
<% end %>
和控制器
def create
@recipe = Recipe.new(params[:recipe])
@recipe.save # some save processing
end