在其父模型

时间:2017-04-15 08:38:56

标签: ruby-on-rails rails-activerecord ruby-on-rails-5 has-many

我有模型A和模型B,关系是A has_many B(和B belongs_to A)。我有一个模型,一个控制器和A的视图,只有一个B.的模型。 我想在A(url / a / 1 / edit)的编辑视图中创建和编辑B的实例。

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

有推荐的方法吗?我想要的是不要破坏rails提供的任何帮助(例如,在转发之后,我认为获取错误消息和类似的东西很痛苦。)

提前致谢!

1 个答案:

答案 0 :(得分:1)

在模型级别,您将使用accepts_nested_attributes_for

ILogger

这使A通过传递带有属性数组的属性class A < ApplicationModel has_many :bs accepts_nested_attributes_for :bs validates_associated :bs end class B < ApplicationModel belongs_to :a end 来获取属性并创建嵌套的bsvalidates_associated可用于确保bs_attributes无法保留A也无效。

创建nested form fields使用fields_for

bs

whitelist nested attributes使用带有子记录的允许属性数组的哈希键:

<%= form_for(@a) do |f| %>
  # field on A
  <%= f.text_input :foo %>
  # creates a fields for each B associated with A.
  <%= f.fields_for(:bs) do |b| %>
    <%= b.text_input :bar %>
  <% end %>
<% end %>

创建新记录时,您还必须“播种”#34;如果您希望存在用于创建嵌套记录的输入,则使用该表单:

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

修改 seed_form也可以只添加一个并且每次都这样做。所以你总会有一个空的&#34;一个要添加。您需要确保在保存之前过滤掉空的,如果未将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 更改为:

accepts_nested_attributes_for