Response_to js возвращает часть HTML-страницы вместе с JavaScript вместо файла js.erb

#javascript #jquery #ruby-on-rails #bootstrap-modal

#javascript #jquery #ruby-on-rails #bootstrap-модальный

Вопрос:

Я пытаюсь переписать форму, чтобы она отображалась как модальная форма. Для этого я использую библиотеки popper и bootstrap, обе они включены в проект и работают. Но у меня ничего не получается, всегда появляется одна и та же ошибка:

 VM44399:1 Uncaught SyntaxError: Unexpected token '<'
    at DOMEval (jquery3.self-74ad.js?body=1:112)
    at Function.globalEval (jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:346)
    at text script (jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:9641)
    at ajaxConvert (jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:8788)
    at done (jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:9256)
    at XMLHttpRequest.<anonymous> (jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:9549)
 

Мои библиотеки js:

 // app/assets/javascripts/application.js 
 
/* External libraries */
//= require jquery3
//= require jquery_ujs
//= require popper
//= require bootstrap
 

В контроллере я использую respons_to для возврата моего js-файла:

  
def new
   respond_to do |f|
      f.js
   end
end
 

Добавьте в index.slim модальные классы и измените ссылку на remote=true:

 = link_to new_article_path, { remote: true,
                              'data-toggle' =>  "modal",
                              'data-target' => '#modal-window',
                              class: 'btn btn-outline-success' }
#modal-window.modal.fade[role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"]
   .modal-dialog.text-left[role="document"]
      .modal-content
 

Переименовал new.slim в _new.slim и добавил к ним модальные классы:

 # ArticlesController

.card.modal-header
  .card-body.w-100
    h5.card-header New Article
    = render 'form'
 

Создайте новый файл .js.erb с помощью js, который добавляет и вызывает модальное окно:

 $("#modal-window").find(".modal-content").html("<%= j (render 'new') %>");
$("#modal-window").modal();
 

В результате я все равно получаю часть какого-то непонятного html с кучей тегов scripts <script src="/assets/jquery-ui/ , как я понимаю, это просто часть всей страницы приложения, в которой есть код с new.js.erb просто в виде кода.

В чем может быть проблема?

Спасибо за ответы!

Ответ №1:

Возможно, следует большему соглашению rails в контроллере:

 def new
  @article = Article.new
end

def create
  @article = Article.create!(article_params)

  respond_to do |format|
    format.js
  end
end
 

Ответ №2:

Проблема решается путем добавления render layout: false внутри format.js или перед методом response_to:

 def new
   respond_to do |format|
     format.js { render layout: false }
   end
end