我是ruby和rails的新手。现在对以下问题感到有些困惑。
我有一个表单,用户可以通过表单添加/编辑条目。表单包含输入字段,标签,复选框和组合框(选择)。
如果用户想要编辑对象,则正确加载存储的数据,但是如果应该添加复选框的数据,例如,项目是否被选中,我收到此错误:
ActionView :: Template :: Error(未定义的方法
submit' for #<Format id: 4, format_name: "RTF">):
method_missing'
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
/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 中。有什么想法吗?
答案 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}