Два способа передачи данных из вашего контроллера в представления:
Опция 1:
Вы отправили из представления запрос json в контроллер:
= link_to "load public places", load_public_places_path(format: :json), class: "btn btn-primary", remote: true, id: "loadPublicPlacesBtn"
В вашем контроллере вы отвечаете в формате json, и данные, которые вы хотите вернуть:
def load_public_places
latitude = params[:lat]
longitude = params[:lng]
@suggested_places = NearBySearchApiService.call(latitude, longitude)
respond_to do |format|
format.json { render json: @suggested_places.to_json }
format.js
end
В представлении, где вы хотите отобразить данные, вы слушаете запрос ajax:
:javascript
document.getElementById('loadPublicPlacesBtn').addEventListener('ajax:success', function(event) {
console.log(event);
})
Вариант 2:
В представлении вы отправляете контроллеру запрос JS:
= link_to "load public places with js", load_public_places_path, class: "btn btn-primary", remote: true, id: "loadPublicPlacesBtn"
В контроллере вы отвечаете за запрос js, которыйбудет в load_public_places.js.erb
def load_public_places
latitude = params[:lat]
longitude = params[:lng]
@suggested_places = NearBySearchApiService.call(latitude, longitude)
respond_to do |format|
# format.json { render json: @suggested_places.to_json }
format.js
end
На этот раз, так как вы используете erb в представлениях, вы можете использовать переменную экземпляра @suggested_places без вызова to_json.
InВ представлении вы выбираете нужный div и добавляете содержимое HTML (вы можете сохранить его в части)
const divWrapper = document.getElementById("optionCardsWrapper");
divWrapper.innerHTML = "<%= j render "option_cards", suggested_places: @suggested_places %>";
@ said_places - это чистый ruby, вам не нужно его анализировать.
j - вспомогательный метод escape_javascript.
В pArtial View вы можете использовать информацию в качестве обычного объекта ruby
%h1 option cards
- suggested_places.each do |place|
= place[:name]