0

我正在使用 form_for 助手在我的应用程序的客户端收集数据。然而奇怪的事情正在发生。我没有收集 :name 和 :description 并且它们都返回为零。这是我的代码:

<%= form_for @type do |f| %>
....

  <%= f.text_field :name, :class => "col-xs-4" %>
  <%= f.text_field :description, :class => "col-xs-4"  %>
<%= f.submit %>
....

我是否需要在 form_for 下创建一个 fields_for 才能使其正常工作?这有点棘手,因为我使用的是@type,在这种情况下,它被设置为告诉视图哪种属性。他们正在看。例如,这一行:

<%= f.label @type %> <label> Description</label>

取决于你在什么视图显示以太:

Group Description
or
Tag Description

并且因为它们在技术上是相同的,所以我对两者使用相同的索引。我希望我对我的问题很清楚,并感谢任何了解我的问题和解决方案的人。

4

1 回答 1

1

参数名称将取决于您传递的对象。

如果@type包含 Group 的实例,那么您将获得 下的参数params[:group],如果它是 Tag 的实例,您将获得它们params[:tag]

<%= form_for @type do |f| %>
  <%= f.label :name, "#{@type.model_name} Description" %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>

注意标签定义。您定义它的方式将创建 2 个标签,第二个标签不会链接到任何字段。

fields_for通常在您在同一个表单中创建多个对象时使用,例如一个项目和与其关联的多个任务。

希望这可以帮助。

更新:

如果@type是字符串或符号,它也应该可以工作。使用这种方法的权衡是,如果在创建对象时出现任何验证错误,则不会显示这些错误,并且不会使用用户在提交表单之前提供的输入预填充字段,从而强制用户输入所有再次信息并猜测哪个是验证错误(您可以从收到的参数中对其进行初始化,但这会使代码的可读性复杂化)

在您看来,唯一不同的是标签定义。

<%= f.label :name, "#{@type} Description" %>
于 2014-09-18T15:58:33.453 回答