I am trying to access an instance variable from a js.erb file.
#controller
def get_person
@person = Person.find(1)
respond_to do |format|
format.js{}
end
end
#get_person.js.erb
alert('<%= @person.last_name %>')
When I browse to [controller_name_here]/get_person.js ... I get a nil object error on @person. (I know Person.find(1) returns an object)
Note: I am actually having trouble rendering a partial in my js.erb file and am trying to identify the cause.
I am trying to access an instance variable from a js.erb file.
#controller
def get_person
@person = Person.find(1)
respond_to do |format|
format.js{}
end
end
#get_person.js.erb
alert('<%= @person.last_name %>')
When I browse to [controller_name_here]/get_person.js ... I get a nil object error on @person. (I know Person.find(1) returns an object)
Note: I am actually having trouble rendering a partial in my js.erb file and am trying to identify the cause.
Share Improve this question edited Jun 3, 2009 at 19:56 Lee asked Jun 3, 2009 at 19:02 LeeLee 9,4623 gold badges31 silver badges34 bronze badges 6- Is the problem in the partial then? If so, you should know that partials don't have access to the class variables of their caller. You need to pass in anything that you want it to have access to. – workmad3 Commented Jun 3, 2009 at 19:15
- Since I am creating the partial in my js.erb file, shouldn't my js.erb file have access to class variables? – Lee Commented Jun 3, 2009 at 19:20
- No. You have to pass them in as locals: <%= render(:partial => 'partials/foo', :locals => {:whatwhat => @somedata}) %> – jonnii Commented Jun 3, 2009 at 19:28
- 2 As an aside, you don't need the empty braces in the format.js line. – John Topley Commented Jun 3, 2009 at 19:34
- ok, so I tried rendering the partial in the js.erb files like so: $("#members").append("<%= escape_javascript(render(:partial => 'partialname', :locals => {:person => @person} ))%>"); but in partial I still an getting a nil object error on person....this is what led me to try and break down the problem. – Lee Commented Jun 3, 2009 at 19:40
2 Answers
Reset to default 5The following works for me:
In/app/controllers/foo_controller.rb
:
class FooController < ApplicationController
def get_person
@person = Person.find(1)
respond_to do |format|
format.js
end
end
end
In /app/views/foo/get_person.js.erb
:
<%= render :partial => '/foo/some_partial', :locals => { :person => @person } %>
In /app/views/foo/_some_partial.js.erb
:
person = {
last_name: '<%= person.last_name -%>'
}
There is no more rendering partials inside your js.erb file. I just discovered this today.
https://github./rails/rails/issues/1370