2015-09-20 104 views
3

我正在尝试渲染使用Ajax的部分文件,其中我使用locals将相关Javascript对象发送到了部分文件。不幸的是,我在发送对象时遇到了问题,并且不断收到错误“未定义的局部变量”。Rails j渲染部分本地文件

控制器:

class TransportationController < ApplicationController 
    respond_to :html, :js, :json 

create.js.erb

function getRates(){ 
    $.ajax({ 
     ... 
     (code cut out that's irrelevant to question, but this request succeeds) 
     ... 

     success: function(json) { 
     json.prices.forEach(function(price){ 
       $("#my_list").append("<%= j render :partial => 'my_item', :locals => {price: price} %>"); 
      }); 
      ....  
}; 

_my_item.html.erb

.... 
     <h1><%= price.display_name %></h1> 
    .... 

错误:(NameError - 未定义的本地变量或方法`价格')

任何帮助排序这将不胜感激!我认为我做得正确

回答

3

有没有必要定义Ajax成功块内的HTML视图,你可以让你的.js文件与控制器动作相关联,它将呈现部分html.HOP它会为你工作。

+0

里面的Ajax功能,我正在给一个外部API,它返回了我遍历呈现部分数据的调用。有没有比将它放入Ajax块更好的方法? – tim5046

+1

建议在控制器动作中进行该API调用,并在Ajax调用中调用该动作。定义控制器动作中的所有变量并呈现视图。 – rakeshp

1

create.js.erb 您可以更改和添加到这一点:

function getRates(){ 
    $.ajax({ 
     ... 
     (code cut out that's irrelevant to question, but this request succeeds) 
     ... 

     success: function(json) { 
     json.prices.forEach(function(price){ 
       $("#my_list").append("<%= j render :partial => 'my_item'"); 
       $("h1.price-display-name").last().text(price.display_name); 
      }); 
      ....  
}; 

_my_item.html.erb:添加新的属性类

.... 
<h1 class="price-display-name"></h1> 
.... 
+0

不幸的是,我得到相同的eeror – tim5046

+1

我可以告诉你'创建'方法吗?你有没有把@price变量放在这个方法中。然后,尝试使用这个'<%​​= escape_javascript(render(:partial =>'my_item',:locals => {:price => @price}))' – akbarbin

+0

该方法的问题在于'price'实际上在我的JS块(它是返回的JSON哈希中的元素)中定义的,所以我无法在控制器中定义它。我的问题是,如何将价格传递到部分右侧,因为我看到了 – tim5046

0

可能,这可能成为方式

function getRates(){ 
    $.ajax({ 
    ... 
    (code cut out that's irrelevant to question, but this request succeeds) 
    ... 

    success: function(json) { 
     json.prices.forEach(function(price){ 
     $("#my_list").append("<%= escape_javascript render(:partial => 'my_item', :locals => {:price => price}) %>"); 
     }); 
     ....  
};