Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 添加到Rails中的联接表_Ruby On Rails_Ruby_Database_Join - Fatal编程技术网

Ruby on rails 添加到Rails中的联接表

Ruby on rails 添加到Rails中的联接表,ruby-on-rails,ruby,database,join,Ruby On Rails,Ruby,Database,Join,所以我有四个数据库表 用户:姓名等。。配方:名称、说明、用户id等,剪贴簿:名称、说明、用户id和剪贴簿条目:用户id、配方id、剪贴簿id 我能够很好地填充用户、菜谱和剪贴簿表,但我现在想做的是有一个选项将菜谱保存到剪贴簿中。通过这样做,我需要填充我为其制作模型的剪贴簿条目表 剪贴簿输入模式: has_one :recipe has_one :scrapbook 配方模型: has_many :scrapbooks, through: :scrapbook_entries 剪贴簿模型 h

所以我有四个数据库表

用户:姓名等。。配方:名称、说明、用户id等,剪贴簿:名称、说明、用户id和剪贴簿条目:用户id、配方id、剪贴簿id

我能够很好地填充用户、菜谱和剪贴簿表,但我现在想做的是有一个选项将菜谱保存到剪贴簿中。通过这样做,我需要填充我为其制作模型的剪贴簿条目表

剪贴簿输入模式:

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
我想在配方视图中创建一个表单,允许我选择一个剪贴簿保存配方,然后提交并填充剪贴簿条目表

我的问题是:我是否需要为我的剪贴簿_条目创建一个新的控制器,并在其中创建一个方法,或者我是否能够使用recipes控制器,如果是,如何使用


我是rails的新手,所以仍在努力解决这一切。谢谢大家!

您不需要为此安装新控制器。你应该能够按照

@recipe.scrapbook_entries.build(scrapbook: @scrapbook)

假设您有一个@recipe变量和一个@scrapbook变量,其中包含一个recipe对象。

这听起来像是一个

它的工作方式是在您的案例中采用嵌套模型ScrapBookEntry,并允许您从父模型配方直接向其发送数据。它有一个学习曲线,但非常有用,特别是当您开始处理大量模块化数据时

接受对象的嵌套属性

有一个

它的工作原理是通过父模型的控制器为嵌套模型构建ActiveRecord对象,从而允许Rails在提交表单时填充这两个对象。这意味着您可以向嵌套模型添加任意数量的数据,同时保持代码的效率

你的代码

您应该能够处理Recipes controller中的所有处理,而不是创建新的控制器,如下所示:

#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 %>

你没有告诉我们你有什么问题。只有你拥有的和你想做的。道歉!是不是更具体一点?添加了一个编辑。是否将其放在创建方法的“配方”控制器中?如果您在创建配方后立即链接它,则为“是”。然而,它不一定非得如此。啊,是的。道歉。配方和剪贴簿应该已经创建好了。这就是为什么我在挣扎。试图找出如何设置表单,然后将表单指向何处。我在猜测配方控制器,但不确定使用什么方法谢谢你提供的丰富信息。如果配方和剪贴簿数据已经存在,并且我只想使用表单用现有数据填充剪贴簿条目表,那么这仍然有效吗?当然,我们使用类似的方法。我们有一个时事通讯应用程序,您可以在其中创建新消息并添加订户。sub必须已经存在,我们只需要使用selectform元素来选择它们。这很有效,因为我建议的方法只会将数据发送到连接模型。我们花了很长时间研究如何通过连接模型创建新元素,结果证明,如果你想这样做,你必须在连接中嵌入另一个嵌套的属性,你基本上只是用ID填充模型。您的验证将是前端的,但无论如何,您只需要向该模型发送一个配方id和剪贴簿id;