首页 > 解决方案 > 控制器在 AJAX 期间不呈现 show.js.haml

问题描述

我正在从 from_tag(搜索框)进行简单的 AJAX 调用,并希望在不刷新页面的情况下显示结果。问题是,即使我可以在服务器控制台中看到显示操作正在作为 JS 处理,它仍然呈现 HTML 而不是 js.haml 文件。我让控制器呈现 js 的唯一方法是将名称更改为 show.js 。然后它可以正常工作。show.js.erb 也不起作用。我也试过 format.js {render layout: false} 没有任何运气。这似乎是控制器方面的问题,但我在这里可能错了。任何想法表示赞赏!

编辑:

控制器操作正在使用渲染“show.js.haml”选项工作。另一个问题是 escape_javascript 在下面的 js.haml 文件中没有做任何事情。

显示.js.haml

$("#main").html("#{escape_javascript(render 'artists/show', locals: {artist: @artist, updates, @updates, reach: @reach, reach_diff: @reach_diff})}");   

控制器

class ArtistsController < ApplicationController

        def index
            if params[:search]
                @artist=Artist.find_by(name: params[:search])
                redirect_to action: "show", id: @artist.id
            else
                @artists= Artist.all
            end
        end

        def show
            @artist= Artist.find(params[:id])
            @updates = @artist.updates.order(created_at: :desc)
            @reach = @artist.reachupdates.order(created_at: :desc)
            @reach_diff= Reachupdate.last_week_diff(@artist.id)

            respond_to do |format|
                format.html
                format.js {render "show.js.haml", layout: false}
            end
        end
    end

标签: javascriptruby-on-railsajaxhamlujs

解决方案


您需要更改render layout: falserender 'show.js.haml', layout: false

def show
  @artist= Artist.find(params[:id])
  @updates = @artist.updates.order(created_at: :desc)
  @reach = @artist.reachupdates.order(created_at: :desc)
  @reach_diff= Reachupdate.last_week_diff(@artist.id)

  respond_to do |format|
    format.html
    format.js {render 'show.js.haml', layout: false}
  end
end

更新:

我遇到的下一个问题是将 ruby​​ 对象插入到 js 文件中

如果文件'articles/show'部分文件,那么问题是locals关键字应该与partial关键字一起使用才能工作。尝试改变这个

$("#main").html("#{escape_javascript(render 'artists/show', locals: {artist: @artist, updates, @updates, reach: @reach, reach_diff: @reach_diff})}");

$("#main").html("#{escape_javascript(render partial: 'artists/show', locals: {artist: @artist, updates, @updates, reach: @reach, reach_diff: @reach_diff})}");

或者

只需删除locals

$("#main").html("#{escape_javascript(render 'artists/show', artist: @artist, updates, @updates, reach: @reach, reach_diff: @reach_diff)}");

推荐阅读