我有一个带有大量字段(112)的 rails 模型,用于加载配置。我想在编辑和显示表单中,仅在该字段已填充时才显示。也就是说,如果数据库中的字段为空,则不要显示它以进行编辑。
有两条记录——主要的一条是 Batch,与 Primer3Batch 类有 1:1 的关系。我正在尝试对 Batch 的显示操作中的 Primer3Batch 类进行编辑,我不确定这是否是一个好主意,甚至会起作用。
我尝试使用属性方法并收到此错误:
undefined method `attributes' for #<SimpleForm::FormBuilder
batches_controller.rb
def show
@batch = Batch.find(params[:id])
@primer3 = Primer3Batch.where(:batch_id => @batch.id)[0]
respond_to do |format|
format.html # show.html.erb
format.json { render json: @batch }
end
end
批次/show.html.erb
<h1>Batch Details: <%= @batch.id %></h1>
<%= simple_form_for(@primer3) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<% f.attributes.each_attribute do |a| %>
<% if a %><%# if a is not nil %>
<%= f.input a %><%# send the field to the form %>
<% end %>
<% end %>
</div>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>
编辑
感谢JSWorld指出使用实例变量的错误。我已经纠正了它,似乎已经走得更远了,但它仍然不太正确。这是更改的行 - 注意attributes.each作为attributes.each_attribute不起作用。
<% @primer3.attributes.each do |a| %>
现在我在表单字段上收到错误:
undefined method `["id", 110]' for #<Primer3Batch:
我想我需要以某种方式改变这个:
a ["id", 110]
进入:
<%= f.input :id %>
* 编辑 2 *
基于IIya Khokhryakov回答的最终代码块。
<%= simple_form_for(@primer3) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<% @primer3.attributes.each_pair do |name, value| %>
<%= f.input name if value %>
<% end %>
</div>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>