当 form_for 使用符号时 fields_for 不起作用

发布于 2024-09-29 08:58:47 字数 1121 浏览 4 评论 0原文

我有一个 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 网络浏览器。

i have a form_for code

<%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%>

it outputs the html code without fields_for function

<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>

when i change the form_for to :

<%form_for @a,:url=>{:controller=>"biz/a",:action=>"save"},:html =>{:multipart => true} do |f| %>

it just work fine.
And it outputs:

<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>

as i want.
why dont the symbol in form_for work fine?what's difference between :a and @a in form_for.
Thanks.
I use rails 2.3.8 , ruby 1.8.7,chrome web browser.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

才能让你更想念 2024-10-06 08:58:47

这是令人沮丧的常见原因。 form_for 实际上根据您传递的是符号还是对象而表现不同。如果您向它传递一个符号,如下所示:

<% form_for :person do |f| %>
  <% f.text_field :name %>
<% end %>

那么表单构建器将工作,但它只会设置参数值,并在 @person 存在时加载默认值。您的帕尔马斯哈希看起来应该是这样的:

params = {
  :person => {
    :name => 'bob'
  }
}

但它不会正确设置您的路线。它会假设您想要提交到您已经所在的同一页面。现在,如果您给它一个对象,form_for 将为您做更多的事情。它将检查该对象是否是新的或正在更新,并将相应地设置表单标记的参数,以及其他一些好处。

老实说,我无法告诉您为什么他们的行为不同。符号版本显然仍然可以访问实例变量(上例中的@person),因为字段将填充其现有值。简单的解决方案是传递实例变量始终是可行的方法,并且可以正常工作。

This is a common source of frustration. form_for actually behaves differently based on whether you pass it a symbol or an object. If you pass it a symbol, like so:

<% form_for :person do |f| %>
  <% f.text_field :name %>
<% end %>

Then the form builder will work, but it will only setup the param values, and load the default values if @person exists. Your parmas hash will look like it should:

params = {
  :person => {
    :name => 'bob'
  }
}

But it won't setup your route properly. It'll assume you want to submit to the same page you're already on. Now if you give it an object, form_for will do much more for you. It will check to see if this object is new, or being updated, and it will set the form tag's parameters accordingly, along with some other benefits.

Honestly, I can't tell you why they behave differently. The symbol version obviously still has access to the instance variable (@person in the example above) because the fields will be populated with their existing values. The easy solution is that passing an instance variable is always the way to go, and will work correctly.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文