创建一个仅存在于视图中且不被保存的模型
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
值。
让我知道这是否有意义。
每当我创建一个新对象时,我都想创建一个在视图中可用但在提交时不保存的嵌套对象。
到目前为止,我的主模型控制器如下所示:
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
值。
让我知道这是否有意义。