fields_for text_field不支持字符串数据类型

时间:2011-10-25 19:26:30

标签: ruby-on-rails nested-forms

我正在检查github上的complex_form_example项目。我修改了迁移文件,以便:内容从t.text更改为t.string(如下所示):请注意,t.string是我在github示例项目中更改的唯一位置,在更改之前工作。

class CreateQuestions < ActiveRecord::Migration
  def self.up
    create_table :questions do |t|
      t.integer :survey_id
      t.string :content
##t.text :content
      t.timestamps
    end
  end

  def self.down
    drop_table :questions
  end
end

这是nested_form_for代码:

<%= nested_form_for @survey do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <%= f.fields_for :questions, :questions do |g|%>
  <p>
  <%= g.label :content, "Question" %><br />
  <%= g.input :content, :rows => 3 %><br />
  <%= g.link_to_remove "remove" %>
</p>
<%= g.fields_for :answers %>
<p><%= g.link_to_add "Add an answer", :answers %></p>
  <% end %>

  <p><%= f.link_to_add "Add a question", :questions %></p>
  <p><%= f.submit "Submit" %></p>
<% end %>

现在我收到以下错误消息:

undefined method `content' for :questions:Symbol

Extracted source (around line #10):

7:   <%= f.fields_for :questions, :questions do |g|%>
8:   <p>
9:   <%= g.label :content, "Question" %><br />
10:   <%= g.text_field :content, :rows => 3 %><br />
11:   <%= g.link_to_remove "remove" %>
12: </p>
13: <%= g.fields_for :answers %>

我的问题是,是否有一个field_for字段名称直接支持字符串类型?

3 个答案:

答案 0 :(得分:1)

你有:questions, :questions ......你看到了吗?在:questions

之前,do出现了两次

答案 1 :(得分:1)

fields_for帮助程序用于获取要为其构建字段的对象,或者为要为其构建字段的对象集合的名称。

第一个例子是这样的:

<%= f.fields_for :object do |object_fields| %>
  # fields go here

在这种情况下,它将构建该对象的字段。

第二个例子是相同的,但不同:

<%= f.fields_for :questions do |question_fields| 5>
  # fields go here
<% end %>

假设您在questions所表示的任何对象上有f方法,这将迭代该集合中的所有对象,并为每个对象显示相同的字段。

请注意:没有必要再次指定:questions 。您只需要告诉Rails 一次

现在,如果您正在执行此操作,您可能希望在父模型中使用accepts_nested_attributes_for :questions(无论是has_many :questions),以便将字段传递给控制器并成功进入模型的createupdate_attributes来电。

答案 2 :(得分:0)

我似乎已经通过仔细地将fields_for标记与结束标记匹配来解决我自己的问题。其工作原理如下:在视图/调查中

<%= nested_form_for @survey do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <%= f.fields_for :questions do |g|%>



  <%= render "question_fields", :f => g %>
  <% end %>



  <p><%= f.link_to_add "Add a question", :questions %></p>
  <p><%= f.submit "Submit" %></p>
<% end %>

在部分_question_fields中:

<p>
  <%= f.label :content, "Question" %><br />
  <%= f.text_field :content, :rows => 3 %><br />
  <%= f.link_to_remove "remove" %>
</p>
<%= f.fields_for :answers %>

<p><%= f.link_to_add "Add an answer", :answers %></p>

请注意,“f.fields_for:answers”默认使用部分_answer_fields。