Контроллер не рендерит show.js.haml во время AJAX - PullRequest
0 голосов
/ 10 сентября 2018

Я делаю простой AJAX-вызов из from_tag (окно поиска) и хочу показать результаты без обновления страницы. Проблема в том, что, хотя я вижу в консоли сервера, что действие show обрабатывается как JS, оно все равно отображает HTML, а не файл js.haml. Единственный способ получить контроллер для рендеринга js - это изменить имя на show.js. Затем он работает как следует. show.js.erb тоже не работает. Я также попробовал format.js {render layout: false}, но безуспешно. Кажется, это проблема со стороны контроллера, но я могу ошибаться здесь. Любые идеи приветствуются!

Редактировать:

Действие контроллера работает с использованием опции render "show.js.haml". Другая проблема заключается в том, что escape_javascript ничего не делает в приведенном ниже файле js.haml.

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

1 Ответ

0 голосов
/ 10 сентября 2018

Вам нужно изменить render layout: false на render '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)}");
...