我正在使用form_for帮助程序在我的应用程序的客户端收集数据。然而,一些奇怪的事情正在发生。我没有收集:名称和:描述,他们都返回为零。这是我的代码:
<%= 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,在这种情况下设置为告诉视图哪种类型的attr。他们正在看。例如,这一行:
<%= f.label @type %> <label> Description</label>
取决于您所使用的视图显示以太:
Group Description
or
Tag Description
并且因为它们在技术上都是相同的,所以我对两者使用相同的索引。我希望我对我的问题很清楚,并感谢任何理解我的问题和解决方案的人。
答案 0 :(得分: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
通常在您在同一表单中创建多个对象时使用,例如Project和与之关联的多个任务。
希望这有帮助。
<强>更新强>
如果@type
是字符串或符号,它也应该有效。使用这种方法的权衡将是,如果在创建对象时存在任何验证错误,那么将不会显示这些错误,并且不会使用用户在提交表单之前提供的输入预填充字段,从而强制用户输入所有再次提供信息并猜测哪个是验证错误(您可以从接收的参数中初始化它,但这会使代码可读性变得复杂)
您视图中不同的独特之处在于标签定义。
<%= f.label :name, "#{@type} Description" %>