我可以在页面的不同部分构建多个对象吗?
Can I build several objects in different parts of a page?
我有一个 Page
模型有很多 TextBlock
:
class Page < ApplicationRecord
has_many :text_blocks, as: :textable, dependent: :destroy
accepts_nested_attributes_for :text_blocks
end
在可以编辑页面的表单中,我必须在表单的上部显示 3 个文本块,在表单的下部显示 3 个文本块。这是我认为的代码...
上方文本块:
<%= render 'shared/admin/form-fields/text-blocks-form', f: f, number: 3, value: true %>
下方文本块:
<%= render 'shared/admin/form-fields/text-blocks-form', f: f, number: 2, value: false %>
这里是 text-blocks-form
部分:
<div class="form-group">
<div class="row">
<div class="col-lg-12 text-blocks">
<div class="row">
<% number.times { f.object.text_blocks.where(upper_position: value).build } unless f.object.text_blocks.where(upper_position: value).any? %>
<%= f.fields_for :text_blocks do |input| %>
<div class="<%= "col-lg-#{cells(number)}" %>">
<%= render 'shared/admin/form-fields/text-blocks-fields', f: input, value: value %>
</div>
<% end %>
</div>
</div>
</div>
</div>
上面的文本块按预期构建,有3个块但是在表格的下部,有5个块而不是2个。看起来,它只是添加3 + 2。有什么办法可以build
上面描述的文本块?先谢谢了。
我可以很容易地解释为什么你有这个问题,也许不太容易以好的方式解决这个问题。
之所以这样做,是因为在第一个 运行 中创建三个嵌套项(在关联上),然后使用 f.fields_for :text_blocks
迭代它们,在第二个 运行 你再添加两个,然后遍历 f.fields_for :text_blocks
将遍历所有五个创建的块。
一个简单的解决方法是按如下方式更改您的视图:
<div class="form-group">
<div class="row">
<div class="col-lg-12 text-blocks">
<div class="row">
<% number.times { f.object.text_blocks.where(upper_position: value).build } unless f.object.text_blocks.where(upper_position: value).any? %>
<%= f.fields_for :text_blocks do |input| %>
<%- if input.object.upper_position == value %>
<div class="<%= "col-lg-#{cells(number)}" %>">
<%= render 'shared/admin/form-fields/text-blocks-fields', f: input, value: value %>
</div>
<% end %>
<% end %>
</div>
</div>
</div>
</div>
如果你总是有 5 个块(3 个在上面,2 个在下面),我也会考虑添加一个 position
或 order
列,允许文本块在 re-rendered保存后的正确位置也是如此。
我有一个 Page
模型有很多 TextBlock
:
class Page < ApplicationRecord
has_many :text_blocks, as: :textable, dependent: :destroy
accepts_nested_attributes_for :text_blocks
end
在可以编辑页面的表单中,我必须在表单的上部显示 3 个文本块,在表单的下部显示 3 个文本块。这是我认为的代码...
上方文本块:
<%= render 'shared/admin/form-fields/text-blocks-form', f: f, number: 3, value: true %>
下方文本块:
<%= render 'shared/admin/form-fields/text-blocks-form', f: f, number: 2, value: false %>
这里是 text-blocks-form
部分:
<div class="form-group">
<div class="row">
<div class="col-lg-12 text-blocks">
<div class="row">
<% number.times { f.object.text_blocks.where(upper_position: value).build } unless f.object.text_blocks.where(upper_position: value).any? %>
<%= f.fields_for :text_blocks do |input| %>
<div class="<%= "col-lg-#{cells(number)}" %>">
<%= render 'shared/admin/form-fields/text-blocks-fields', f: input, value: value %>
</div>
<% end %>
</div>
</div>
</div>
</div>
上面的文本块按预期构建,有3个块但是在表格的下部,有5个块而不是2个。看起来,它只是添加3 + 2。有什么办法可以build
上面描述的文本块?先谢谢了。
我可以很容易地解释为什么你有这个问题,也许不太容易以好的方式解决这个问题。
之所以这样做,是因为在第一个 运行 中创建三个嵌套项(在关联上),然后使用 f.fields_for :text_blocks
迭代它们,在第二个 运行 你再添加两个,然后遍历 f.fields_for :text_blocks
将遍历所有五个创建的块。
一个简单的解决方法是按如下方式更改您的视图:
<div class="form-group">
<div class="row">
<div class="col-lg-12 text-blocks">
<div class="row">
<% number.times { f.object.text_blocks.where(upper_position: value).build } unless f.object.text_blocks.where(upper_position: value).any? %>
<%= f.fields_for :text_blocks do |input| %>
<%- if input.object.upper_position == value %>
<div class="<%= "col-lg-#{cells(number)}" %>">
<%= render 'shared/admin/form-fields/text-blocks-fields', f: input, value: value %>
</div>
<% end %>
<% end %>
</div>
</div>
</div>
</div>
如果你总是有 5 个块(3 个在上面,2 个在下面),我也会考虑添加一个 position
或 order
列,允许文本块在 re-rendered保存后的正确位置也是如此。