2009-06-03 8 views
6

J'essaie d'accéder à une variable d'instance à partir d'un fichier js.erb.rails: accéder à une variable d'instance dans un fichier js.erb

#controller 
def get_person 
    @person = Person.find(1) 

    respond_to do |format| 
    format.js{} 
    end 
end 

#get_person.js.erb 
alert('<%= @person.last_name %>') 

Lorsque je navigue à [controller_name_here] /get_person.js ... J'obtiens une erreur d'objet nul sur @person. (Je sais Person.find (1) retourne un objet)

Note: Je suis en fait de la difficulté à rendre une partie dans mon dossier js.erb et essaie d'identifier la cause.

+0

Est-ce le problème alors partiel? Si c'est le cas, sachez que les partiels n'ont pas accès aux variables de classe de leur appelant. Vous devez transmettre tout ce à quoi vous voulez qu'il ait accès. – workmad3

+0

Puisque je crée le partial dans mon fichier js.erb, mon fichier js.erb ne devrait-il pas avoir accès aux variables de classe? – Lee

+0

Non. Vous devez les passer en local: <% = render (: partial => 'partials/foo', : locals => {: whatwhat => @somedata})%> – jonnii

Répondre

5

Les œuvres suivantes pour moi:

En /app/controllers/foo_controller.rb:
class FooController < ApplicationController 
    def get_person 
    @person = Person.find(1) 
    respond_to do |format| 
     format.js 
    end 
    end 
end 
En /app/views/foo/get_person.js.erb:
<%= render :partial => '/foo/some_partial', :locals => { :person => @person } %> 
En /app/views/foo/_some_partial.js.erb:
person = { 
    last_name: '<%= person.last_name -%>' 
} 
+0

est étrange, les variables d'instance sont destinées à être visibles dans tous les locaux afin partials construire ne devrait pas être nécessaire (dans ce cas particulier) . Il y a quelque chose d'autre qui ne va pas ici. –

+0

c'est vraiment étrange. Je reçois "L'erreur est survenue lors de l'évaluation de nil.last_name" – Lee

+0

Lee: vous êtes sûr que vous utilisez "<% = person.last_name -%>" et non "<% = @ person.last_name -%>" dans le partiel? –

Questions connexes