Rails / Javascript: атрибут данных не возвращается через частичный, но присутствует в DOM - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь отобразить значение поля выбора для стоимости доставки ниже поля.Благодаря @Vasfed я пытаюсь использовать атрибуты данных и JavaScript.Но хотя атрибут данных отображается в DOM при загрузке th-страницы, он не возвращается в данных, возвращаемых для вызова AJAX при проверке консоли или ресурсов.

В DOM:

<select id="shippingservices_select" name="cart[shippingservice_id]"><option value="">select a carrier</option>
  <option value="7" data-price="3.9">UPS</option>
  <option value="19" data-price="10.0">DHL</option>
</select>

Полученный фрагмент:

$("#shippingservices_select").empty()
  .append("<option value=\"7\">UPS<\/option><option value=\"19\">DHL<\/option>");

Я использую следующий вызов ajax:

$(document).on("change", "#lands_select", function(event){
  jQuery.ajax({
    url: "/carts/update_shipping/" + event.target.value,
    type: "GET",
    error: function (xhr, status, error) {
      console.error('AJAX Error: ' + status + error);
    },
    success: function (response) {
      console.log(response);
    }
  });
});

, который должен возвращать как значение, так и атрибут данных, для формы:

<%= form_for :cart, :url => {:action => "show_shipping"}, :html => { :method => "get", :remote => true } do |f| %>
  <%= f.collection_select(:land_id, Land.all, :id, :name, {:prompt => "select a country"}, {:id => 'lands_select'}) %><br>
  <%= f.select(:shippingservice_id, options_for_select(@shippingservices.collect { |s| [s.name.titleize, s.id, {'data-price' => s.price}] }), {:prompt => "select a carrier"}, {:id => 'shippingservices_select'}) %><br>
<% end %>
Shipping: €<div id="shipping_cost"></div><br>

с представлением update_shipping.js.erb:

$("#shippingservices_select").empty()
  .append("<%= escape_javascript(render(:partial => @shippingservices)) %>");

и обработанным частичным _shippingservice.html.erb из:

<option value="<%= shippingservice.id %>" data-price="<%= shippingservice.price %>"><%= shippingservice.name.titleize %></option>

В контроллере у меня есть:

def update_shipping
  ...
  respond_to do |format|
    format.js
  end
end

После моего частичного _shippingservice.html.erb я должен получить и значение, и атрибут данных, но я не получаю.Я думаю, что это причина, по которой:

$(document).on("change", "#shippingservices_select", function(event){
  var price = $(event.target).data('price');
  $("#shipping_cost").html(price);
});

не возвращает значение data-price.

Как я могу заставить это работать?Заранее спасибо.

ОБНОВЛЕНИЕ

Я пытался ее устранить, и все выглядит довольно странно.

Оба селектора отображают данные вDOM.Поле выбора службы доставки, которое загружается при загрузке страницы, показывает все.При изменении селектора земель загружаемая часть, которую я могу просмотреть в консоли, отображает только значение параметра + имя, но при изменении части _shippingservice я обнаружил, что код, загружаемый через AJAX, по-видимому, не генерируетсячастично указывается в вызове JS Ajax, поскольку я могу изменить код внутри, не оказывая никакого влияния на доставленную полезную нагрузку.

Но при замене

<%= escape_javascript(render(:partial => @shippingservices))%>

на

<%= escape_javascript(render ‘carts/shippingservice’)%>

Ничего не отображается и не загружается.

1 Ответ

0 голосов
/ 22 декабря 2018

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

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

render partial: 'carts/shippingservice', collection: @shippingservices, as: :shippingservice
...