/ / ¿Error de Ruby? causar un ActionView :: Template :: Error - método indefinido - ruby, erb

¿Ruby error alguno? causar un ActionView :: Plantilla :: Error - método indefinido - ruby, erb

Soy nuevo en ruby ​​y rieles. Y ahora un poco confundido sobre el siguiente problema.

Tengo un formulario donde el usuario puede agregar / editar entradas a través de un formulario. El formulario contiene campos de entrada, etiquetas, casillas de verificación y cuadros combinados (seleccionar).

Si el usuario desea editar un objeto, los datos almacenados se cargan correctamente, pero si se deben agregar los datos de la casilla de verificación, p. Ej. el elemento está seleccionado o no, aparece este error:

ActionView :: Template :: Error (método indefinido 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
método_missing "
/usr/lib/ruby/vendor_ruby/active_record/attribute_methods.rb:149:in `method_missing"

El siguiente es un pequeño ejemplo de mi _form_input, html.erb, pero también causa el mismo error.

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

Desarrollo y pruebo esto en dos sistemas. Mi sistema de prueba las siguientes versiones:

Ruby versión 1.9.3 (i686-linux)
Rails versión 3.2.13

El sistema de producción:

Ruby versión 1.8.7-p358 (2012-02-08) [x86_64-linux]
Rails versión 3.2.13

He leído la documentación de ruby ​​de las enumerables v1.8.7 y v1.9.3, pero no encuentro el error. Si elimino el f.submit (line 14) funciona.

Sé que el error es causado por book.source_formats.any? { |f| f.id == 4 } y solo ocurre en v1.8.7. ¿Algunas ideas?

Respuestas

1 para la respuesta № 1

Esta línea

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

anula f referencia. Cámbielo a f.x .:

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

Esto responde a la pregunta ¿por qué ?: Alcance variable en bloques

El alcance variable para bloques se introdujo en 1.9


1 para la respuesta № 2
<%= form_for :book, :url => { :action => action }, :method => method do |f| %>

aquí f es la variable de referencia para su bloque de formulario, se anula aquí en la siguiente línea

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

cambie la variable de bloque local aquí para la fuente del libro a algo como decir bs

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

Resolverá el problema. Forker le dio un buen enlace sobre el alcance variable en bloques para 1.9.x ruby.


1 para la respuesta № 3

El alcance variable en bloques para ruby ​​1.9+ se ha discutido aquí @ Alcance variable en bloques y la referencia de la variable f del mismo nombre está causando este problema. Cambie el nombre de la variable para el formato de fuente del libro como el siguiente book.source_formats.any? {|sf| sf.id == 4}