gpt4 book ai didi

ruby-on-rails - 在 Rails 中保存动态字段

转载 作者:行者123 更新时间:2023-12-04 05:45:12 24 4
gpt4 key购买 nike

在我的 Rails 应用程序中,页面、块、块内容、字段和字段内容。

这些协会是:

class Page < ActiveRecord::Base
has_many :blocks
has_many :block_contents, :through => :blocks
end

class Block < ActiveRecord::Base
belongs_to :page
has_many :block_contents
end

class BlockContent < ActiveRecord::Base
belongs_to :block
has_many :field_contents
end

class Field < ActiveRecord::Base
has_many :field_contents
end

class FieldContent < ActiveRecord::Base
belongs_to :block_content
belongs_to :field
validates :content, presence: true
end

使用它,我可以为页面创建动态字段。

然而,写入数据库目前是在 Controller 中完成的,如下所示:
def update
@page = Page.find(params[:id])
if params[:field_content].present?
params[:field_content].each do |block_content|
block_content.last.each do |field|
field_content_row = FieldContent.where(block_content_id: block_content.first, field_id: field.first).first
if field_content_row.present?
field_content_row.update(content: field.last)
else
field_content = FieldContent.new
field_content.block_content_id = block_content.first
field_content.field_id = field.first
field_content.content = field.last
field_content.save
end
end
end
end
if @page.update_attributes(page_params)
redirect_to pages_path
else
render 'edit'
end
end

虽然这确实有效,但它很脏,并且不会在 View 中显示我对 FieldContent 的验证(验证确实有效,因为如果它们无效,它们不会保存 FieldContent,但它应该阻止整个页面保存并在 View 中显示)。

我该如何制作才能显示 FieldContent 的验证?

想看风景的 friend 们:
<% @page.blocks.each do |block| %>
<% block.block_contents.each do |block_content| %>
<% field_group.fields.each do |field| %>
<input name="field_content[<%= block_content.id %>][<%= field.id %>]" id="field_content_<%= block_content.id %>_<%= field.id %>" type="text" value="<%= get_field_content(block_content, field.name) %>">
<% end %>
<% end %>
<% end %>

以及我用来获取内容的助手:
def get_field_content(block_content, field)
content = ''
block_content.field_contents.each do |field_content|
if field_content.field.name == field && field_content.block_content_id == block_content.id
content = field_content.content
end
end
content
end

最佳答案

首先,为了提交包含多个模型的表单,您首先需要做的是接受嵌套属性。

在您的 page.rb 文件中,输入:

class Page < ActiveRecord::Base
has_many :blocks
has_many :block_contents, :through => :blocks
accepts_nested_attributes_for :field_contents

其次在 View 中 - 您必须使用 'fields_for' 指定哪些字段适用于哪个模型 所以在 form_for @page 中,您应该输入:
 <%= f.fields_for :field_contents do |b| %>

因为 :field_contents 是唯一将与@page 一起更新的对象。这样整个表单元素看起来像这样:
<% @page.blocks.each do |block| %>
<% block.block_contents.each do |block_content| %>
<% field_group.fields.each do |field| %>
<%= form_for @page do |f| %>
<%= f.input :any attribute %>
<%= f.fields_for :field_contents do |b| %>
<%= b.text_field :content %>
<%= f.fields_for :block_contents do |b| %>
<%= b.hidden_field :block_content, value: "#{@block_content.id}"%>
<% end %>
<% end %>
<% end %>
<% end %>
<% end %>
<% end %>

由于我了解到您已经可以访问@page.field_content,您不必触摸 Controller 中的任何内容,因为它会根据现有关系自动更新记录。

因此,既然我们在单个请求中提交了所有模型,您指定希望在验证发生后在 View 中显示错误消息。这是容易的部分。

据我所知,您目前正在验证 :content 的存在.

在您看来:只需放置一个 HTML 标签或一个 rails 内容标签
<p class= "error"><%= "Your error message"if @field_content.errors[:content].present? %></p>

如果您有任何其他问题,请告诉我。

关于ruby-on-rails - 在 Rails 中保存动态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41488867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com