Контроллер не отображает show.js.haml во время AJAX

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

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

Действие контроллера работает с использованием параметра рендеринга "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

Попробуйте render 'show.js.haml', layout: false

Pavan 10.09.2018 09:12

Да! Это сработало. Спасибо

Oscar Sidebo 10.09.2018 18:11
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
404
1

Ответы 1

Вам нужно сменить 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

Обновлять:

The next issue I'm having is to insert ruby objects to the js file

Если файл '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)}");

Это работает, и отображается правильный файл. Следующая проблема, с которой я столкнулся, - это вставить объекты ruby ​​в файл js. Хотел бы использовать здесь js.haml, поскольку он используется для остальной части приложения. Show.js.haml очень прост и выглядит так: $ ("# main"). Html ("# {escape_javascript (@ artist.name)}");

Oscar Sidebo 11.09.2018 00:41

@OscarSidebo Я обновил свой ответ. Примите его, если он решит вашу проблему.

Pavan 11.09.2018 12:23

К сожалению, это не так: /. В выводе используется этот код - это просто инструкция Ruby. (локальные переменные удалены для краткости). <% = escape_javascript (отображать 'исполнители / шоу', местные жители: {…]%>

Oscar Sidebo 11.09.2018 16:48

@OscarSidebo Вы правильно помещаете это в кавычки? "<%= escape_javascript(render 'artists/show', locals: {artist: @artist, updates, @updates, reach: @reach, reach_diff: @reach_diff}) %>"

Pavan 11.09.2018 17:09

да. И при просмотре HTML он выглядит точно так же, включая кавычки. Кажется, что это просто обрабатывается как строка. Действительно неприятно! Не могу не думать, что это, возможно, связано с HAML? Я хотел бы использовать HAML, но буду много работать с AJAX и не стоит, если это сопутствует головной боли ...

Oscar Sidebo 11.09.2018 18:10

@OscarSidebo Приносим свои извинения. Я понял, что вы используете haml. Удалил моё обновление.

Pavan 11.09.2018 18:40

@OscarSidebo Является ли файл 'articles/show' частичным?

Pavan 11.09.2018 18:45

Это не партиал, но я попытался изменить его на партиал с подчеркиванием в начале имени, и это не имело значения. Также попробовал оба ваших предложения синтаксиса выше. Он по-прежнему просто выводит весь этот оператор в виде строки. Почему-то все, что находится внутри # {}, вообще не выполняется.

Oscar Sidebo 11.09.2018 19:50

Хорошо, кажется, я нашел ключ к разгадке, почему это не работает, потому что, когда я пытаюсь отобразить index.js.erb вместо перенаправления, чтобы сначала показать действие, он отлично работает как с erb, так и с haml.

Oscar Sidebo 12.09.2018 03:50

Другие вопросы по теме