最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - rails: accessing an instance variable in a js.erb file - Stack Overflow

programmeradmin0浏览0评论

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
 |  Show 1 more ment

2 Answers 2

Reset to default 5

The 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

发布评论

评论列表(0)

  1. 暂无评论