0

構成をロードするために、多数のフィールド (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 %>
4

2 に答える 2

2

あなたの意図が@primer3.attributesではないことを願っていますf.attributes。エラーはフォームオブジェクトであり、それに関連付けられてfいないためです。attributes

于 2013-06-23T10:29:58.533 に答える