Rails:使用simple_form迭代属性

时间:2013-06-23 10:19:47

标签: ruby-on-rails simple-form

我有一个带有大量字段(112)的rails模型,用于加载配置。我想,在编辑和显示表单中,如果字段已填充,则仅显示。也就是说,如果数据库中的字段为 null ,则不显示该字段以进行编辑。

有两条记录 - 主要是Batch,与Primer3Batch类有1:1的关系。我正试图在Batch的show动作上对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 %>

2 个答案:

答案 0 :(得分:2)

我希望你的意图是@primer3.attributes,而不是f.attributes。该错误是因为f是表单对象,并且没有attributes与之关联。

答案 1 :(得分:1)

@primer3.attributes是模型属性及其值的哈希值。所以你可以这样做:

<% @primer3.attributes.each_pair do |name, value| %>
  <%= f.input name if value %>
<% end %>