Есть ли способ визуализации js.erb после вызова выборки? - PullRequest
0 голосов
/ 04 апреля 2019

В моем приложении на Rails я хочу визуализировать партиал js.erb после вызова выборки, и по некоторым причинам я не понимаю, что он не работает. Если бы вы могли мне помочь, было бы здорово.

В представлении, событие вызывает эту функцию, которая в основном выполняет запрос на выборку:

function updateState(id, state){
      const csrfToken = document.querySelector('meta[name="csrf-token"]').attributes
          .content.value;
      fetch(window.location.origin + "/update_state", {
          method: "POST",
          headers: {
            'Accept': "JS",
            "Content-Type": "application/json",
            "X-CSRF-Token": csrfToken
          },
          body: JSON.stringify({'id': id, 'state': state}),
          credentials: "same-origin"
        })
}

Тогда в моем контроллере:

  def update_state
    @model = Model.find(params[:id])
    authorize @model
    @model.update(state: params[:state])

    respond_to do |format|
      format.html { redirect_to xxx }
      format.js
    end
  end

В моих файлах js.erb:

console.log('hello');

Однако в этом случае я получаю сообщение об ошибке от сервера: ActionController :: UnknownFormat в строке 'reply_to do | format | У меня такое ощущение, что сервер не понимает заголовок выборки: «Принять»: «JS»

Когда я просматриваю логи сервера:

Started POST "/update_state" for 127.0.0.1 at 2019-04-04 11:22:49 +0200
Processing by ModelsController#update_state as JS

Но я думаю, что Rails не распознает это. Как мне это сделать?

Я попробовал также это в контроллере:

  def update_state
    @model = Model.find(params[:id])
    authorize @model
    @model.update(state: params[:state])
    render 'update_state.js', layout: false
  end

Который не вызывает ошибок. Я получил на стороне клиента js.erb. Однако он не выполняется (console.log не выполняется).

У вас есть идеи? Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 01 мая 2019

Была такая же проблема, и здесь на самом деле две проблемы. Вы правы, ваши заголовки нет. Эти заголовки для запуска .js.erb сработали для меня и выглядят довольно правильно:

'dataType': 'json',
'contentType': 'application/json; charset=utf-8',
'X-Requested-With': 'XMLHttpRequest',
'X-CSRF-Token': - your CSRF method to get the token -

Но во-вторых, чтобы вызвать ответ js, ваш блок respond_to:

respond_to do |format|
  format.html { redirect_to xxx }
  format.js
end

Сначала должен быть формат .js. Поскольку у rails есть ответ для HTML, он сначала ответит HTML и, похоже, даже не ищет следующий блок формата.

respond_to do |format|
  format.js
  format.html { redirect_to xxx }
end

Надеюсь, это поможет: -)

...