2011-08-27 12 views
5

Como novato de Ruby on Rails, entiendo que las referencias "@" y ":" tienen diferentes significados. Vi this post en SO, que describió algunas de las diferencias.Ruby - Diferencia entre: variable y @variable

  1. @ indica una variable de instancia (por ejemplo, @my_selection)
  2. : indica un alias (por ejemplo,: my_selection)

me encontré con una situación en la que tenía una norma Página de MVC, similar a todas las otras formas/páginas en mi aplicación web.

html.erb snippet

<%= form_for @my_selection do |f| %> 

route.rb snippet

resources :my_selections 

Cuando intento acceder a esta página, me sale este error:

NoMethodError in selections#create 
Showing C:/somedir/myapp/app/views/my_selections/index.html.erb where line #16 raised: 
undefined method `my_selection_index_path' for #<#<Class:0x1197e5676>:0x25439c3b> 

La línea 16 es el fragmento de formulario n arriba.

Todos mis otros formularios/páginas en la misma aplicación web están configurados exactamente de la misma manera y funcionan bien. Sin embargo, una vez que cambié la referencia de formulario erb a : my_selection, este error desapareció y mi página se comportó normalmente.

Preguntas:

  1. es mi comprensión de la diferencia entre: my_selections y @my_selections correcto?
  2. ¿Por qué cambiar a: my_selection resolver el error original?

Respuesta

13

Is my understanding of the difference between :my_selections and @my_selections correct?

Nop :(

: indica un símbolo, no es un alias para nada intrínsecamente. Es como una cadena inmutable, que se utiliza a menudo como un nombre para representar algo.

En los lugares donde Rails api acepta un símbolo en lugar de una variable de instancia, internamente está haciendo esto:

self.instance_variable_get "@#{my_symbol}" 

que en realidad devuelve el valor de la variable de instancia solicitada.

Así que la única razón por la que cree que el símbolo corresponde a la variable de instancia es porque el código que controla la API que está utilizando funciona de esa manera. Sin un marco para hacer eso por usted, no hay ninguna correlación en absoluto.

Why would switching to :my_selection resolve my original error?

for_form(model_instance) generará un formulario que se somete a la acción de crear, si la instancia del modelo no se ha guardado, o a la acción de actualización si el modelo ya está saliendo en su base de datos.

No, no sé qué hay en @my_selection, pero sea cual sea la clase, parece que no está generando las rutas correctamente.

resources :my_selections 

generará una ruta debe invocar la siguiente manera:

my_selections_path 

Cómo su forma está generando una ruta para my_selection_index_path no estoy seguro y que realmente depende de lo que sus modelos son.

Y cuando pasa un símbolo en su lugar, y no hay un ivar correspondiente, lo usa como el nombre del modelo para la generación de ruta. Lo cual haría lo correcto al intentar invocar my_selections_path, que se basa directamente en el símbolo que ingresa.

+0

Tendré que verificar qué está haciendo mi modelo, pero definitivamente agradezco la explicación. – JW8

Cuestiones relacionadas