Ruby on rails 在其父模型的视图上创建嵌套模型实例(具有多个关系)

Ruby on rails 在其父模型的视图上创建嵌套模型实例(具有多个关系),ruby-on-rails,rails-activerecord,ruby-on-rails-5,has-many,Ruby On Rails,Rails Activerecord,Ruby On Rails 5,Has Many,我有一个模型a和一个模型B,关系是a有许多B,B属于a。我有一个模型,一个控制器和a的视图,只有一个B的模型。 我想在url/A/1/edit的edit视图上创建和编辑B的实例 我知道我可以为B创建一个控制器,并在a的视图中使用表单调用这些方法,但是我需要重定向回a的视图,因为我不想要B的实际视图 有推荐的方法吗?我想要的是不要破坏rails提供的任何帮助,例如,在转发之后,我认为收到错误消息和类似的东西是一件痛苦的事情 提前谢谢 在您将使用的模型级别上 要将哈希键与子记录的允许属性数组一起使用

我有一个模型a和一个模型B,关系是a有许多B,B属于a。我有一个模型,一个控制器和a的视图,只有一个B的模型。 我想在url/A/1/edit的edit视图上创建和编辑B的实例

我知道我可以为B创建一个控制器,并在a的视图中使用表单调用这些方法,但是我需要重定向回a的视图,因为我不想要B的实际视图

有推荐的方法吗?我想要的是不要破坏rails提供的任何帮助,例如,在转发之后,我认为收到错误消息和类似的东西是一件痛苦的事情


提前谢谢

在您将使用的模型级别上

要将哈希键与子记录的允许属性数组一起使用,请执行以下操作:

params.require(:a)
      .permit(:foo, bs_attributes: [:id, :bar])
class AsController < ApplicationController

  def new
    @a = A.new
    seed_form
  end

  def create
    @a = A.new(a_params)
    if @a.save 
      redirect_to @a
    else
      seed_form
      render :new
    end
  end

  def update
    if @a.update(a_params) 
      redirect_to @a
    else
      render :edit
    end
  end

  private

  def seed_form
    5.times { @a.bs.new } if @a.bs.none?
  end

  def a_params
    params.require(:a)
          .permit(:foo, bs_attributes: [:id, :bar])
  end
end
创建新记录时,如果希望有用于创建嵌套记录的输入,还必须为表单设定种子:

params.require(:a)
      .permit(:foo, bs_attributes: [:id, :bar])
class AsController < ApplicationController

  def new
    @a = A.new
    seed_form
  end

  def create
    @a = A.new(a_params)
    if @a.save 
      redirect_to @a
    else
      seed_form
      render :new
    end
  end

  def update
    if @a.update(a_params) 
      redirect_to @a
    else
      render :edit
    end
  end

  private

  def seed_form
    5.times { @a.bs.new } if @a.bs.none?
  end

  def a_params
    params.require(:a)
          .permit(:foo, bs_attributes: [:id, :bar])
  end
end

尝试gem cocoon用于嵌套表单。您可以在此处获取文档,以防不需要从视图中输入,您只需在模型A上使用“保存前/保存后”回调方法。因此,当您的编辑方法保存更新的模型A时,将触发回调,然后您可以在该回调中编辑关联的模型。如果您需要从视图编辑嵌套模型的字段,那么最好使用@Mayank提到的gem cococoon。这通常是Rails中最复杂的部分之一,我要求您在提出后续问题之前,请仔细阅读此答案中的文档链接。不,您不需要cocoon gem。它确实使处理嵌套记录的某些方面变得更容易,但也提取了许多重要的知识。非常感谢您的详细回答。如果我有后续问题,我会调查并回来。一旦我做了,就把答案标记为正确。我现在只有一个后续问题。使用这种方法,一切都在A的控制器中处理。在设计或需求的情况下,为B创建嵌套控制器需要什么不同?是否只针对专用视图?或者有没有其他原因让我们更喜欢一种方法而不是另一种方法?好的,我已经尝试以完全相同的方式实现了这一点。当我用一个B实例创建一个A实例时,它可以正常工作,但当我开始编辑它时,它也会复制B的所有实例。不过,现有B实例的ID有隐藏字段。我错过什么了吗?
accepts_nested_attributes_for :bs, reject_if: proc { |attr| attr['bar'].blank? }