Ruby on Rails - 发出 AJAX 请求并渲染结果模型的一部分

Ruby on Rails - Make an AJAX request and render the partial of the resulting model

我到处寻找我的疑问的答案,但 none 对我有用(我可能做错了什么)。

我对 Rails 上的 Ruby/Ruby 很陌生,所以我不太了解它是如何工作的。


我的申请中有两个模型

我也有两个控制器:

我也有以下看法../app/views/product_models/new.html.erb。在此视图中,我希望能够创建一个属性并在之后立即将其显示给用户(使用 AJAX)

<div id="attributes_list">
  <%= render :partial => "attributes/attribute", :collection => @attributes, :as => :attribute %>
</div>

<div id="new_attribute">
  <strong>Adicionar novo atributo</strong> <br />
  Nome: <input type="text" class="name"><br />
  <span class="create_button">Criar</span>
</div>

对于这种情况,我有以下jquery(在../app/assets/javascripts/application.js中):

$(document).ready(function () {
    var new_attribute_div = $(document).find('#new_attribute')
    new_attribute_div.on('click', '.create_button', function () {
        // alert('funfou');
        $.ajax({
            url: '/attributes',
            type: 'POST',
            dataType: "script",
            data: {
                name: new_attribute_div.find(".name").val()
            },
            success: function (data) {
                $(document)
                    .find('#attributes_list')
                    .append("<%= j render @attribute %>");

                new_attribute_div.find(".name").val("");

            },
            error: function (data) {
                alert("error:" + data)
            }
        });
    });
});

我的attributes_controller也是这样

class AttributesController < ApplicationController

  def create
    @attribute = Attribute.new(attribute_params)
    @attribute.save

    respond_to do |format|
      format.html { redirect_to @attribute }
      format.js
      format.json
    end
  end
end

private
def attribute_params
  params.permit(:name)
end

我遇到的问题是,当执行 jquery 的以下行时

.append("<%= j render @attribute %>");

rails 不是渲染属性的一部分,而是渲染字符串本身 (<%= j render @attribute %>)

我做错了什么? 如何呈现从控制器返回的@attribute?

奥古斯托, 您应该在 jquery 内包含代码的 Rails 部分 #{ } 所以应该是:

.append("#{<%= j render @attribute %>}");

您不能在资产中使用 rails 片段或变量

"<%= j render @attribute %>"

要解决此问题,您必须在 attributies/create.js.erb

中包含 .js.erb 文件

在文件中传递你的渲染属性

$(document)
      .find('#attributes_list')
      .append("<%= j render @attribute %>"

记住,只有当请求以 JS 形式出现时才会触发。