Ruby 有什么错误吗?导致ActionView::Template::Error-未定义的方法

Ruby 有什么错误吗?导致ActionView::Template::Error-未定义的方法,ruby,erb,Ruby,Erb,我是ruby和rails的新手。现在对下面的问题有点困惑 我有一个表单,用户可以通过表单添加/编辑条目。表单包含输入字段、标签、复选框和组合框(选择) 如果用户想要编辑对象,则正确加载存储的数据,但如果应添加复选框的数据,例如,是否选择了项,则我会收到以下错误: ActionView::Template::Error(未定义的方法submit'for#)): 11: 12: 13: 14: 15: 16: 17:'书籍'> /usr/lib/ruby/vendor\u ruby/active\u

我是ruby和rails的新手。现在对下面的问题有点困惑

我有一个表单,用户可以通过表单添加/编辑条目。表单包含输入字段、标签、复选框和组合框(选择)

如果用户想要编辑对象,则正确加载存储的数据,但如果应添加复选框的数据,例如,是否选择了项,则我会收到以下错误:

ActionView::Template::Error(未定义的方法
submit'for#)):
11:


12:
13:
14:


15:
16:
17:'书籍'>
/usr/lib/ruby/vendor\u ruby/active\u model/attribute\u methods.rb:407:in
method\u missing'
/usr/lib/ruby/vendor\u ruby/active\u record/attribute\u methods.rb:149:in'method\u missing'

下面是我的表单输入html.erb的一个小例子,但它也会导致相同的错误

    <%= form_for :book, :url => { :action => action }, :method => method do |f| %>
    <%= field_set_tag(l(:fieldset_book_info)) do%>
            <%= f.hidden_field :id , :value => @book.id %>
            <p><%= label(:create_ticket, "checked", l(:label_create_ticket)) %><%= check_box :create_ticket, "checked", :checked => "checked", :disabled => Setting.plugin_books['create_ticket'], :checked_value => true, :unchecked_value => false  %></p>
            <p><%= f.label :title %><br /><%= f.text_field :title %></p>
            <p><%= f.label :isbn10 %><br /><%= f.text_field :isbn10 %></p>
            <p><%= f.label :isbn13 %><br /><%= f.text_field :isbn13%></p>
    <%end%>
          <%= debug @book.source_formats.any? { |f|  f.id == 4 } %>     
         <p><%= f.submit msg  %></p>
<% end %>
{:action=>action},:method=>methoddo | f |%>
@book.id%>
“选中”,“禁用=>设置.插件\u书籍['create\u ticket'],:选中的\u值=>true,:未选中的\u值=>false%>




我开发并测试了两个系统。我的测试系统包括以下版本:

Ruby版本1.9.3(i686 linux)
Rails版本3.2.13

生产系统:

Ruby版本1.8.7-p358(2012-02-08)[x86_64-linux]
Rails版本3.2.13

我已经阅读了可枚举v1.8.7和v1.9.3的ruby文档,但没有发现错误。如果我删除
f.submit(第14行)
它会工作

我知道错误是由
book.source\u formats.any引起的?{| f | f.id==4}
它只出现在v1.8.7中。有什么想法吗?

这行

<%= debug @book.source_formats.any? { |f|  f.id == 4 } %>
这回答了为什么的问题:

1.9中引入了块的可变范围

{:action=>action},:method=>methoddo | f |%>
这里f是表单块的引用变量,它在下面的行中被重写

<%= debug @book.source_formats.any? { |f|  f.id == 4 } %>

将book source的本地块变量更改为类似于say bs的值

<%= debug @book.source_formats.any? { |bs|  bs.id == 4 } %>


这将解决问题。Forker为您提供了一个关于ruby 1.9.x版本块中变量作用域的好链接。

ruby 1.9+版本块中的变量作用域在这里已经讨论过@,同名变量f reference导致了这个问题。更改book source格式的变量名,如下所示
book.source\u formats.any?{| sf | sf.id==4}

您在
之前有
显示您的
\u表单输入的完整列表,html.erb
太多了。那是一个愚蠢的初学者错误!
<%= debug @book.source_formats.any? { |f|  f.id == 4 } %>
<%= debug @book.source_formats.any? { |bs|  bs.id == 4 } %>