Сложный запрос активных записей для ресурса AJAX - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть одно поле выбора для стран, второе поле выбора для вариантов доставки для данной страны, и когда выбрана 1-я страна и 2-я доставка, я хотел бы отобразить стоимость доставки.

Когда я загружаюкорзина доставки в первый раз с показом ресурса shippingservices правильно сопоставлена ​​для первой страны (только услуги для определенного веса и выбранной страны), но когда я использую тот же запрос для действия update_shipping ресурса ajax, который я получаюpostzones.land_id = NULL

Мой контроллер:

class CartsController < ApplicationController

  def show
    @cart = Cart.find(params[:id])
    @shippingservices = @cart.available_shipping_services.includes(:lands, :postzones).where('postzones.land_id = ?', Land.first.id)
  end

  def update_shipping
    @cart = Cart.find(params[:id])
    @shippingservices = @cart.available_shipping_services.includes(:lands, :postzones).where('postzones.land_id = ?', params[:land_id])
    respond_to do |format|
      format.js
    end
  end
end

В моей модели тележек у меня есть:

def available_shipping_services
  Shippingservice.where('weightmin <= ? and weightmax >= ?', total_weight, total_weight).where('shippingservices.shippingcarrier = ?', '1') 
end

Javascript AJAX часть благодаря @rewritten:

$(document).on("change", "#lands_select", function(event){
  $.ajax({
    url: "/carts/update_shipping/" + event.target.value,
    type: "GET"
  })
});

app / views / carts / update_shipping.js.erb:

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

и app / views / carts / _shippingservices.html.erb is:

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

Когда я пытаюсь сделать вызов ajax, я получаю:

Started GET "/carts/update_shipping/2" for 127.0.0.1 at Tue Dec 18 14:17:21 +0100 2018
Processing by CartsController#update_shipping as */*
  Parameters: {"id"=>"2"}
  Cart Load (0.4ms)  SELECT `carts`.* FROM `carts` WHERE `carts`.`id` = ? LIMIT 1  [["id", 5]]
  Cart Load (0.2ms)  SELECT `carts`.* FROM `carts` WHERE `carts`.`id` = ? LIMIT 1  [["id", "2"]]
  CartItem Load (0.4ms)  SELECT `cart_items`.* FROM `cart_items` WHERE `cart_items`.`cart_id` = 2
  SQL (0.9ms)  SELECT `shippingservices`.`id` AS t0_r0, `shippingservices`.`serviceID` AS t0_r1, `shippingservices`.`title` AS t0_r2, `shippingservices`.`name` AS t0_r3, `shippingservices`.`shippingcarrier` AS t0_r4, `shippingservices`.`length` AS t0_r5, `shippingservices`.`width` AS t0_r6, `shippingservices`.`height` AS t0_r7, `shippingservices`.`weightmin` AS t0_r8, `shippingservices`.`weightmax` AS t0_r9, `shippingservices`.`price` AS t0_r10, `shippingservices`.`created_at` AS t0_r11, `shippingservices`.`updated_at` AS t0_r12, `lands`.`id` AS t1_r0, `lands`.`name` AS t1_r1, `lands`.`partof` AS t1_r2, `lands`.`continent` AS t1_r3, `lands`.`area` AS t1_r4, `lands`.`CallingCode` AS t1_r5, `lands`.`ISOcode2` AS t1_r6, `lands`.`ISOcode3` AS t1_r7, `lands`.`created_at` AS t1_r8, `lands`.`updated_at` AS t1_r9, `postzones_shippingservices`.`id` AS t2_r0, `postzones_shippingservices`.`land_id` AS t2_r1, `postzones_shippingservices`.`shippingservicezone` AS t2_r2, `postzones_shippingservices`.`shippingservice_id` AS t2_r3, `postzones_shippingservices`.`created_at` AS t2_r4, `postzones_shippingservices`.`updated_at` AS t2_r5 FROM `shippingservices` LEFT OUTER JOIN `postzones` ON `postzones`.`shippingservice_id` = `shippingservices`.`id` LEFT OUTER JOIN `lands` ON `lands`.`id` = `postzones`.`land_id` LEFT OUTER JOIN `postzones` `postzones_shippingservices` ON `postzones_shippingservices`.`shippingservice_id` = `shippingservices`.`id` WHERE (weightmin <= 0 and weightmax >= 0) AND (shippingservices.shippingcarrier = 'Poste italiane') AND (postzones.land_id = NULL)
  Rendered collection (0.0ms)
  Rendered carts/update_shipping.js (3.2ms)
Completed 200 OK in 13ms (Views: 7.6ms | ActiveRecord: 1.8ms)

Я полагаю, все настроено правильно, но контроллер не может разрешить запрос активных записей, так как он ищет (postzones.land_id = NULL).

Как я могу получить что-то вроде: postzones.land_id = Параметры: {"id" => "2"}.Что означает все службы доставки, которые учитывают вес корзины для страны с идентификатором: 2?

Заранее всем спасибо.

ОБНОВЛЕНИЕ:

В моем приложении / views /carts / show.html.erb У меня есть следующая форма:

<%= form_for :cart, :url => {:action => "update_shipping"}, :html => { :method => "get", :remote => true } do |f| %>
  <%= f.select(:land_id, options_for_select(@lands.collect { |l| [l.name, l.id]}, 0), {}, {:prompt => "select a country", :id => 'lands_select'}) %><br>
  <%= f.select(:shippingservice_id, options_for_select(@shippingservices.collect { |s| [s.title.titleize, s.id] }, 0), {}, {:id => 'shippingservices_select', :prompt => "select a carrier"}) %><br>
  <%= f.submit "Calculate shipping" %><br>
<% end %>

Страница показа carts_controller показывает текущую корзину доставки.Модель тележек знает свой вес через carts_items.Это позволяет мне рассчитать в модели общий вес корзины и сделать запрос в модели, который приводит к доступному_сервису, который я использую на странице показа, чтобы успешно создать первую загрузку, где для первой записи отображаются все доступные решения, нокаждое последующее изменение приводит к появлению второй пустой формы селектора.

Возможно, {:action => "update_shipping"} неправильный, и его позже придется заменить другим действием, которое должно отображать итоговую стоимость доставки, но сейчас я сосредоточился на получениидва выбранных поля работают.

Thangs снова!

1 Ответ

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

params[:land_id] - ноль, потому что вы не передали его URL.Возможно, вы захотите передать его как параметр запроса (GET "/carts/update_shipping/2?land_id=4") или даже лучше передать его в теле запроса POST (например, с удаленной формой)

...