我的Ajax调用返回js.erb文件作为浏览器中的响应。如何使其返回json内容,还执行js.erb文件?

时间:2018-07-09 06:11:06

标签: ruby-on-rails json ruby ajax response

我是Ruby on Rails的新手,正在尝试一个应用程序。我的应用程序正确执行了Ajax调用,但是响应在浏览器中显示为js.erb文件。执行js.erb文件时如何显示json响应?有可能还是有更好的方法?

谢谢。

我的控制器文件

def new
  @department = Department.new
  # respond_to do |format|
  #   format.html
  #   format.json {render json: @department}
  # end
end

def create
  @departments = Department.all
  @department = Department.create(department_params)
  respond_to do |format|
    format.html
    format.js {render json: @department}
  end
end

Controller

我的表单部分

<div class="modal-dialog">
  <div class="modal-content">
  <%= form_for @department, remote: true, data: {type: :json} do |f| %>
  <div class="modal-body">
    <h2> Department: </h2>
    <ul class="errors"></ul>

    <div class="form-group">
      <%= f.label :title, class:"control-label" %>
      <%= f.text_field :title, class: "form-control" %>
    </div>
    <div class="form-group">
      <%= f.label :body, class: "control-label" %>
      <%= f.text_field :body, class: "form-control" %>
    </div>
  </div>
  <div class="modal-footer">
    <%= f.submit class: "btn btn-primary .departmentCreate" %>
    <%= link_to "Cancel", "#", class: "btn", data: {dismiss: "modal"} %>
  </div>
<% end %>
</div>
</div>

Form.html.erb

如果我保留format.js,我的Json响应{render json:@department} Json Response

如果我从控制器中删除render json,我的响应: JS response

我的new.js.erb文件

$("#department-modal").html("<%= escape_javascript(render 'departments/new') %>")
$("#department-modal").modal("show")

我的_new.html.erb部分:

<%= render "form" %>

我的create.js.erb文件:

<%= render 'save' %>

我的_save.js.erb部分:

$("ul.errors").html("")
<% if @department.errors.any? %>
  <% @department.errors.full_messages.each do |message| %>
    $("ul.errors").append($("<li />").html("<%= message.html_safe %>"))
<% end %>
<% else %>
  $(".department-index").html("<%= escape_javascript(render 'departments/index') %>")
  $("#department-modal").modal("hide")
  

在浏览器中呈现json响应时,js.erb文件未执行。 js.erb文件执行时如何在浏览器中显示json响应? 谢谢:)

4 个答案:

答案 0 :(得分:1)

  

当js.erb文件执行时,如何在浏览器中显示json响应?   谢谢:)

如果我正确理解了您的要求,那么答案是您不会。您回复的Content-Type将是application/jsonapplication/javascript

浏览器将使用此标头来处理响应。

答案 1 :(得分:0)

JavaScript无法执行的原因是因为您的控制器中存在一个块来处理响应。因此,代码将永远无法到达您的JavaScript文件。

更改行:

 sampleRateSlider.valueProperty().addListener((ov, old_val, new_val) -> {
        new_val = Math.round(new_val.doubleValue());
        sampleRateSlider.setValue(new_val.doubleValue());
        System.out.println(new_val.intValue());
        sampleRateValueLabel.setText(new_val.toString());
    });

收件人:

format.js { render json: @department }

这将告诉Rails您接受JavaScript请求,并且由于未指定任何块,因此使用了“ app / views / departments / create.js.erb”中的模板。

如果您不想渲染默认模板,则可以在块中指定它,如下所示:

format.js

或:

format.js { render: :new } # renders app/views/departments/new.js.erb

答案 2 :(得分:0)

从控制器以完整路径代替js.erb的嵌套渲染直接渲染模板。假设_save.js.erb的完整路径是departments/save 另外,在创建新部门后应计算@departments,以便新创建的记录将与@departments

相加
def create
  @department = Department.create(department_params)
  @departments = Department.all
  render template: 'departments/save'
end

始终将局部变量与局部变量一起传递:_

$("ul.errors").html("")
<% if @department.errors.any? %>
  <% @department.errors.full_messages.each do |message| %>
    $("ul.errors").append($("<li />").html("<%= message.html_safe %>"))
<% end %>
<% else %>
  $(".department-index").html("<%= j render 'departments/index', departments: @departments) %>")
  $("#department-modal").modal("hide")

答案 3 :(得分:0)

您不能同时渲染两者,但是可以在服务器端渲染部分内容,并将结果存储在JSON 中。在客户端,您可以处理JSON,并提取并使用JS代码中呈现的HTML代码段。

Jbuilder中用于渲染部分语法的语法:

json.some_key json.partial! 'my_partial.js.erb'

所以堆栈就像..

控制器

# Render the JSON partial in views

respond_to do |format|
    format.json {}
end

查看-控制器操作将调用默认的json构建器进行操作,例如views/departments/new.json.jbuilder

在这里呈现所需的任何原始JSON,例如@department,还呈现所需的JS部分并将其存储在JSON中

json.department @department


json.department_form json.partial! 'new.js.erb'

然后在接收JSON的客户端代码中,例如data,部分代码将出现在键 department_form 下,您可以将呈现的表单分配给html占位符原始视图中的元素

     //... ajax call to your controller#action
     dataType: "json",
     success: function(data) {
                $("#department_form_placeholder").html(data['department_form'])