【问题标题】:Create a model that only exists in the view and doesn't get saved创建仅存在于视图中且不保存的模型
【发布时间】:2015-05-03 01:51:34
【问题描述】:

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

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

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 =&gt; true, :reject_if =&gt; proc { |a| a[:hide] == 1 }

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

如何创建模型,使其永远不在数据库中,或者在将父模型保存到数据库时删除?

深入:

我有一个 Experiments 模型 has_many exptypes

在我的form 中,我使用了嵌套形式的 gem,因此(通过尝试将它与标签混合),@experiment.exptypes 不能为空。

hide 属性在第 93 行和第 118 行用于确定是否隐藏选项卡。

这样,每当创建 experiment 时,它们将是数组中已经存在的假 exptype,我不希望在提交时保存它。

【问题讨论】:

  • 去查看/提交时不保存你能澄清发生了什么吗? hide 值是否在页面加载后正确显示在表单/页面中(意味着您可以检查它并在浏览器中查看它),或者您是说提交表单时它没有正确发送?
  • 对不起,我把自己弄糊涂了。我已经重写了这个问题。我说的是第二种,页面提交后好像没有发送。
  • 好的,这更清楚了。请参阅下面的答案,让我知道它是否有所作为。除了在控制器中创建 Sub 对象的方式之外,可能还有几件事会导致此问题,因此如果解决方案失败,您可能需要进一步隔离问题发生的位置。

标签: ruby-on-rails activerecord model


【解决方案1】:

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

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

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

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

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

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

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

让我知道这是否有意义。

【讨论】:

  • @Darkstarone reject_if 没有删除它?如果将条件更改为a[:hide] == "1",会有所不同吗?
  • @Darkstarone 我不知道这是否过于简单化,或者我是否仍然不太明白,但如果您隐藏了具有hide == 1exptype 的选项卡,您是否应该在 if 语句中移动 f.fields_for :exptypes... 块?这样,如果它“隐藏”,它就不会被渲染,并且无需担心它是否被创建,或者在提交后不得不拒绝它。
  • @Darkstarone 好的,我明白了。所以有两件事,在实现了这个改变之后,它仍然没有将hide 值发送到服务器(也就是参数映射中的not)?您是否将 hide 字段添加到强参数过滤器中?
  • 这里肯定有人挑眉。你想显示你的 exptype_fields 部分,只是为了确保没有什么奇怪的事情发生
  • 我刚想说,我在里面看不到它。 :) 没问题,很高兴你最终能弄明白。
猜你喜欢
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
相关资源
最近更新 更多