構成をロードするために、多数のフィールド (112) を持つ Rails モデルがあります。編集フォームと表示フォームで、フィールドが既に入力されている場合にのみ表示したいと思います。つまり、データベースでフィールドがnullの場合、編集用に表示しません。
レコードは 2 つあります。主なものは Batch で、Primer3Batch クラスとは 1:1 の関係があります。Batch の show アクションで Primer3Batch クラスを編集しようとしています。
attributesメソッドを使用してみましたが、次のエラーが発生しています。
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_attributeは機能しないため、attributes.eachに注意してください。
<% @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 %>