所以我有四个数据库表。
用户(:名称等..)食谱(:name,:description,:user_id等..),Scrapbooks(:name,:description,:user_id)和Scrapbook_Entry(:user_id,recipe_id,:scrapbook_id)
我可以很好地填充用户,食谱和剪贴簿表,但我现在想要做的是将食谱保存到剪贴簿中。通过这样做,我需要填充我为其制作模型的Scrapbook_Entry表。
Scrapbook_Entry模型:
has_one :recipe
has_one :scrapbook
食谱模型:
has_many :scrapbooks, through: :scrapbook_entries
剪贴簿模型
has_many :recipes, through: :scrapbook_entries
用户模型
has_many :recipes, dependent: :destroy
has_many :scrapbooks, dependent: :destroy
我想在配方视图中创建一个表单,允许我选择一个剪贴簿来保存配方,然后提交并填充Scrapbook_Entry表。
我的问题是:我是否需要为scrapbook_entries创建一个新的控制器并在其中使用create方法或者我是否能够使用配方控制器?如果是,那么如何?< / p>
我是rails的新手,所以仍然想要全力以赴。谢谢!
答案 0 :(得分:0)
您不需要新的控制器。你应该能够按照
的方式做点什么@recipe.scrapbook_entries.build(scrapbook: @scrapbook)
假设您的@recipe
变量中包含Recipe
个对象,并且@scrapbook
变量中包含Scrapbook
个对象。
答案 1 :(得分:0)
这听起来像是accepts_nested_attributes_for
它的工作方式是它采用“嵌套模型”(在您的情况下为ScrapBookEntry
),并允许您从父模型(Recipe
)直接向其发送数据。它有一个学习曲线,但非常有用,特别是当你开始处理大量模块化数据时
接受
的嵌套属性有一个great RailsCast on this subject here
它的工作原理是通过父模型的控制器为嵌套模型构建一个ActiveRecord对象,从而允许Rails在提交表单时填充两个对象。这意味着您可以在保持代码效率的同时,为嵌套模型添加尽可能多的数据
您的代码
您应该能够处理Recipes
控制器中的所有处理,而不是创建新的控制器,如下所示:
#app/models/recipe.rb
Class Recipe < ActiveRecord::Base
accepts_nested_attributes_for :scrapbook_entries
end
#app/controllers/recipes_controller.rb
def new
@recipe = Recipe.new
@recipe.scrapbook_entries.build #-> repeat for number of fields you want
end
def create
@recipe = Recipe.new(recipe_params)
@recipe.save
end
private
def recipe_params
params.require(:recipe).permit(:recipe, :params, scrapbook_entries_attributes: [:extra, :data, :you, :want, :to, :save])
end
#app/views/recipes/new.html.erb
<%= form_for @recipe do |f| %>
<%= f.text_field :example_field %>
<%= f.fields_for :scrapbook_entries do |s| %>
<%= f.text_field :extra_data %>
<% end %>
<% end %>