创建一个仅存在于视图中且不被保存的模型

Create a model that only exists in the view and doesn't get saved

每当我创建一个新对象时,我都想创建一个在视图中可用但在提交时不保存的嵌套对象。

到目前为止,我的主模型控制器如下所示:

def new
    @main = Main.new
    @tmp = Sub.new
    @tmp.hide = 1
    @main.subs << @tmp
end

其中 hide 是一个整数字段,用于指定它是否为假模型。

我的问题 hide 值在我单击提交后似乎不存在(它存在于视图中)。

例如,如果我正常提交,@tmp 会与任何其他字段一起保存。但是,如果我尝试在节目中显示 hide,则会显示 @tmp,但不会显示 hide 值。

hide 默认为零。所以提交后会出现,控制器中的更改不存在。

我的理解是我可以使用:

accepts_nested_attributes_for :subs, :allow_destroy => true, :reject_if => proc { |a| a[:hide] == 1 }

main模型中,但这似乎不起作用。

我如何创建模型,让它永远不会在数据库中,或者当父级保存到数据库时删除?

深度:

我有一个 Experiments model that has_many exptypes

在我的 form 中,我使用了嵌套形式 gem,因此(由于试图将其与制表符混合),@experiment.exptypes 不能 为空。

第93行和第118行使用hide属性来决定是否隐藏tab。

这样,无论何时创建 experiment,它们都是数组中已经存在的假 exptype,我不想在提交时保存它。

注意:这可能是一个XY问题,所以这个提议的解决方案可能不会对整体问题产生影响。如果是这种情况,我们可能需要查看 Sub 模型和您提到的表格。

在这种情况下,您可能希望使用 build (documentation) 关联方法来创建依赖的 Sub 对象。所以你的控制器代码会像这样改变:

def new
  @main = Main.new
  @main.subs.build(hide: 1)
end

这将创建一个新的 Sub 对象,但它不会保存到数据库中。 << 方法 确实 保存到数据库,但这通常不是 new 资源路由所期望的行为。

在您的视图表单中,您仍然可以使用 fields_for 访问 Sub 对象,就像访问任何依赖对象一样。示例:

<% f.fields_for :subs do |subs_form| %>
    <%= subs_form.text_field :hide %>
<% end %>

这将为您提供一个文本字段,其中已经填充了您在控制器中设置的 hide 值。

让我知道这是否有意义。