当 form_for 使用符号时 fields_for 不起作用
-
27-09-2019 - |
题
我有一个 form_for 代码
<%form_for :a,:url=>{:controller=>"biz/a",:action=>"save"},:html =>{:multipart => true} do |f| %>
.....
<%f.fields_for :b do |b|%>
.....
<%b.fields_for :apples do |apple|%>
...
<%end%>
....
<%end%>
它输出没有 fields_for 函数的 html 代码
<textarea cols="40" id="a_b_apples_content" name="a[b][apples][content]" rows="20" style="width:500px;height:100px;border:1px #889BAA solid;color:#999;font-size:12px;padding:6px;"></textarea>
当我将 form_for 更改为:
<%form_for @a,:url=>{:controller=>"biz/a",:action=>"save"},:html =>{:multipart => true} do |f| %>
它工作得很好。它输出:
<textarea cols="40" id="a_b_apples_content" name="a[b_attributes][apples_attributes][0][content]" rows="20" style="width:500px;height:100px;border:1px #889BAA solid;color:#999;font-size:12px;padding:6px;"></textarea>
如我所愿。为什么form_for中的符号不能正常工作?form_for中的:a和@a有什么区别?谢谢。我使用 Rails 2.3.8 、 ruby 1.8.7 、chrome 网络浏览器。
解决方案
这是令人沮丧的常见原因。 form_for
实际上,根据您传递的是符号还是对象,行为会有所不同。如果你传递一个符号,如下所示:
<% form_for :person do |f| %>
<% f.text_field :name %>
<% end %>
然后表单构建器将工作,但它只会设置参数值,并在 @person 存在时加载默认值。你的帕尔马斯哈希看起来应该是这样的:
params = {
:person => {
:name => 'bob'
}
}
但它不会正确设置你的路线。它会假设您想要提交到您已经所在的同一页面。现在如果你给它一个对象, form_for
将为您做更多的事情。它将检查该对象是否是新的或正在更新,并将相应地设置表单标记的参数,以及其他一些好处。
老实说,我不能告诉你 为什么 他们的行为不同。符号版本显然仍然可以访问实例变量(上例中的@person),因为字段将填充其现有值。简单的解决方案是传递实例变量始终是可行的方法,并且可以正常工作。
不隶属于 StackOverflow