Как ответить на выборку (пост) с js .erb? - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь сделать почтовый запрос, который будет захватывать все события (джемы) и динамически обновлять страницу с помощью ajax. Таким образом, мой контроллер получает параметры в формате JSON, и я хотел бы ответить js так же, как вы делаете с remote: true для ссылки или кнопки.

Я использую rails 6.0.2.2

Это в моем. js file =>

const getJams = () => {
  const mapCenter = map.getCenter();
  const mapBounds = map.getBounds();
  const token = document.getElementsByName("csrf-token")[0].content
  fetch(window.location.origin + "/search", {
    method: "POST",
    headers: {
      'Accept': "text/javascript",
      'Content-Type': "application/javascript",
      'X-CSRF-Token': token
    },
    body: JSON.stringify({
      map_center: mapCenter,
      max_lat: mapBounds._ne.lat,
      min_lat: mapBounds._sw.lat,
      max_lng: mapBounds._ne.lng,
      min_lng: mapBounds._sw.lng
    }),
    credentials: "same-origin"
  })
}

Метод в контроллере поиска, куда отправляются данные, выглядит следующим образом =>

def index
    @jams = policy_scope(Jam)

    respond_to do |f|
      f.json do |f|
        render json: {
          jams: render_to_string(
            partial: 'jams/jams',
            formats: :html,
            layout: false,
            locals: { jams: @jams }
          )
        }
      end
    end
  end

Выполнено так, внутри моего клопа есть параметры, так что это кажется правильным. Если я продолжу, мой сервер покажет мне

Completed 406 Not Acceptable in 1ms (ActiveRecord: 0.0ms | Allocations: 889)



ActionController::UnknownFormat (ActionController::UnknownFormat):

app/controllers/searchs_controller.rb:7:in `index'

Я бы хотел работать с этим поиском. js .erb, чтобы добавить элементы в мое представление. Хотя мой поиск. js .erb содержит просто console.log("a");, но этот js, похоже, не выполняется. В консоли ничего не отображается.

Если бы кто-нибудь мог мне помочь, я был бы благодарен.

Вот внутренняя часть джема / _jam. html .erb частичная =>

<% jams.each do |jam| %>
<div class="jam-card">
  <%= image_tag jam.photo %>
  <%= jam.status %>
  <%= jam.user.first_name %>
  <%= jam.music_style.music_style %>
  <%= display_date(jam.start_date_time, jam.duration) %>
  <%= jam.participants.count %>/<%= jam.max_participants %>
</div>
<% end %>

1 Ответ

0 голосов
/ 10 апреля 2020

Совет. Вам не нужны js.erb шаблоны.

  • Они создают полный беспорядок потока. Достигнув шаблона js.erb, вы теперь переключаете контекст между Ruby и JavaScript и на стороне сервера и на стороне клиента в каждой строке. Эта умственная гимнастика не продвигает код хорошего качества.
  • js.erb шаблоны не обслуживаются каналом ресурсов / веб-упаковщиком и поэтому не минифицируются и не обслуживаются CDN.
  • Вы знаете, что приятно спокойное серверное приложение, которое вы тщательно создали? Kiss это до свидания, потому что теперь он отвечает за преобразования на стороне клиента и полон покачиваний маршрутов и кода спагетти javascript просмотров.

Либо ответьте на запрос массивом JSON объектов и позвольте клиентской стороне обрабатывать шаблоны или передавать строку HTML обратно в ответ JSON, и пусть ваш настоящий обработчик ajax фактически сделает свою работу:

def index
  @jams = policy_scope(Jam)
  respond_to do |f|
    f.json do 
      render json: { 
        jams: render_to_string(
          partial: 'jams/jams', 
          formats: :html, 
          layout: false, 
          locals: { jams: @jams}
        )
     }
    end
  end
end

.then(function(response) {
  document.getElementById("some_element").innerHTML = response;
})

Там также есть подходы, в которых люди использовали request.xhr для отправки чанков HTML в ответ на запрос HTML ajax или использования пользовательских типов контента. Все они лучше, чем js.erb.

...