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

时间:2014-02-13 13:13:49

标签: ruby erb

我是ruby和rails的新手。现在对以下问题感到有些困惑。

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

如果用户想要编辑对象,则正确加载存储的数据,但是如果应该添加复选框的数据,例如,项目是否被选中,我收到此错误:

  

ActionView :: Template :: Error(未定义的方法submit' for #<Format id: 4, format_name: "RTF">):
11: <p><%= f.label :isbn13 %><br /><%= f.text_field :isbn13%></p>
12: <%end%>
13: <%= debug @book.source_formats.any? { |f| f.id == 4 } %>
14: <p><%= f.submit msg %></p>
15: <% end %>
16: <% content_for :header_tags do %>
17: <%= javascript_include_tag "book_form", :plugin => 'books' %>
/usr/lib/ruby/vendor_ruby/active_model/attribute_methods.rb:407:in
method_missing'
    /usr/lib/ruby/vendor_ruby/active_record/attribute_methods.rb:149:在`method_missing'

以下是我的_form_input,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 %>

我在两个系统上开发和测试它。我的测试系统有以下版本:

  

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

生产系统:

  

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

我已经阅读了可枚举的v1.8.7和v1.9.3的ruby文档,但是找不到错误。如果我删除f.submit (line 14)它的工作原理。

我知道错误是由book.source_formats.any? { |f| f.id == 4 }引起的,它只发生在 v1.8.7 中。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

这一行

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

覆盖f引用。将其更改为f.x。:

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

这回答了为什么?:Variable Scope in Blocks

的问题
  

块的可变范围在1.9

中引入

答案 1 :(得分:1)

<%= form_for :book, :url => { :action => action }, :method => method do |f| %>

这里f是表单块的引用变量,它在下面的行中被覆盖

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

将此处的本地块变量更改为书籍来源,例如说bs

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

它将解决问题。 Forker为1.9.x ruby​​提供了关于变量范围的良好链接。

答案 2 :(得分:1)

这里讨论了ruby 1.9+的块中的变量范围@ Variable Scope in Blocks并且同名变量f reference引起了这个问题。更改图书来源格式的变量名称,如以下book.source_formats.any? {|sf| sf.id == 4}