Comment utiliser une méthode Rails en version Javascript?

Dans mon modèle de vue (show.html.erb), je peux utiliser <%= @item.name %> et il <%= @item.name %> le nom de mon élément, qui est stocké dans ma base de données. Cependant, lorsque j'essaie de définir une variable dans mon fichier Javascript (item.js.erb) comme ceci,

 var item_name = '<% @item.name %>' 

It (Rails) renvoie une erreur ("NoMethodError", "méthode indéfinie` name "pour nil: NilClass").

Comment puis-je bien tisser mes méthodes Rails et JavaScript ensemble? Existe-t-il une meilleure façon de saisir des choses de ma base de données en utilisant Javascript / jQuery?

Le problème

Le fichier que vous éditez existe dans le dossier des ressources, ce qui signifie qu'il sera servi directement sans passer de contrôleur, et comme l'extension se termine par un .erb vous disposez de fonctionnalités ruby ​​dans le fichier, c'est pourquoi vous pouvez déformer un code dans <%= %> Sans erreur.

La chose est que vous n'avez pas une variable appelée @items dans les actifs, donc vous ne pouvez pas y accéder, mais vous pouvez faire quelque chose comme var item = <%= 1 + 2 %> et le résultat sera 3

Un travail autour

En supposant qu'il s'agisse d'un code js spécifique à un élément, vous devez définir la variable dans votre vue, alors, à votre avis, essayez d'ajouter quelque chose comme ça

 # inside #show.html.erb <script> var item_name = '<%= @item.name %>'; </script> # the rest of the view code 

De cette façon, le javascript sera chargé à partir des actifs, mais la variable sera définie à partir de la vue, cela devrait résoudre votre problème.

N'oubliez pas de supprimer cette ligne de l'autre fichier js (celui qui existe dans le dossier des ressources)

Mettre à jour

Une autre façon serait d'ajouter un bloc de rendement pour le code js dans votre en-tête, au-dessus de vos autres balises js, de cette façon, vous pouvez toujours vous assurer que vos variables sont définies avant que les autres fichiers ne soient chargés, voici un exemple

 # application.html.erb <html> <head> <script> <%= yield :extra_js %> </script> # include other js and css </head> # the rest of the layout </html> 

À votre avis, vous diraz les rails où appartient ce code

 # show.html.erb <% content_for :extra_js do %> var item_name = '<%= @item.name %>'; <% end %> # the rest of your view. 
 var item_name = '<%= @item.name %>' 

Généralement ce code est correct ( <%= devrait être utilisé à la place de <% ) et si vous rendez ERB template et produira:

 var item_name = 'somename' 

Il renvoie une erreur (méthode non définie).

Dans ce cas, @item n'est pas ce que vous attendez. Probablement il est nil et n'a pas de méthode de name .


METTRE À JOUR

Définissez @item ici. Par exemple:

 def show @item = Item.find_by(1) end 

Et @item ne sera pas nil dans erb (si le premier élément se trouve, bien sûr)