【问题标题】:Rails j render partial with localsRails j 局部渲染
【发布时间】:2015-12-16 23:33:25
【问题描述】:

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

控制器:

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 - 未定义的局部变量或方法 `price')

任何帮助解决这个问题将不胜感激!我以为我做得对

【问题讨论】:

    标签: javascript jquery ruby-on-rails ajax ruby-on-rails-3


    【解决方案1】:

    无需在 Ajax 成功块中定义 html 视图,您可以将 .js 文件与将呈现部分 html 的控制器操作相关联。希望它对您有用。

    【讨论】:

    • 在 Ajax 函数内部,我正在调用一个外部 API,该 API 返回我正在迭代以呈现部分的数据。有没有比将其放入 Ajax 块更好的方法?
    • 建议在控制器动作中调用 API,并在 Ajax 调用中调用该动作。在控制器动作中定义所有变量并渲染视图。
    【解决方案2】:

    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>
    ....
    

    【讨论】:

    • 不幸的是我得到了同样的错误
    • 我可以认识你create 方法吗?您是否将@price 变量放入此方法中。然后,尝试使用这个&lt;%= escape_javascript(render(:partial =&gt; 'my_item', :locals =&gt; {:price =&gt; @price}))
    • 这种方法的问题是 price 实际上是在我的 JS 块中定义的(它是返回的 JSON 哈希中的一个元素),所以我无法在控制器中定义它。我的问题是如何在生成时将price 传递到其中的部分
    • 我明白了。您不能像您的价格那样在标签导轨中设置 Javascript 变量。我会更新我的答案。
    • 是的,这确实有效,并且是我必须开始的。问题是我有一个非常复杂的项目要附加(不仅仅是 price.display_name),因此我想将价格传递给一个部分,在那里我可以做更多的事情而不会在 JS 代码中变得混乱
    【解决方案3】:

    可能是这样的

    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}) %>");
            });
            ....    
    };
    

    【讨论】:

      【解决方案4】:
      猜你喜欢
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多