Ajax запрос в рельсах - PullRequest
       5

Ajax запрос в рельсах

0 голосов
/ 16 ноября 2018

Здравствуйте, у меня возникла проблема при попытке выполнить Ajax-запрос, я думаю, что вход в неправильный маршрут, это мой js.

$(function () {
    $('#sucursal').change(function () {
        $.ajax({
            url: "/tickets/filter_by_id",
            type: "GET",
            data: { sucursal: $('#sucursal option:selected').text() }
        }).done(function (msg) {
            console.log(msg)
        }).fail(function (msg, txtStatus) {
            console.log(msg);
        });
    });
});

а это мой контроллер.

def filter_by_sucursal
      render :text => "Ok"
end

и бросает это:

ActiveRecord::RecordNotFound in TicketsController#show\n\nCouldn't find Ticket with 'id'=filter_by_id

Я думаю, что это указывает на это из-за этого, но я не уверен.

before_action :set_ticket, only: [:show, :edit, :update, :destroy]

Надеюсь, вы могли бы помочь мне. Привет.

1 Ответ

0 голосов
/ 16 ноября 2018

Вы должны иметь в виду, что ваши маршруты ищутся сверху вниз. Итак, когда вы делаете это:

resources :tickets 
post '/tickets/filter', to: 'tickets#filter_by',          as: 'filter_by' 
get '/tickets/filter',  to: 'tickets#filter_by_sucursal', as: 'filter_by_sucursal' 

Вы получаете:

            tickets GET    /tickets(.:format)                        tickets#index
                    POST   /tickets(.:format)                        tickets#create
         new_ticket GET    /tickets/new(.:format)                    tickets#new
        edit_ticket GET    /tickets/:id/edit(.:format)               tickets#edit
             ticket GET    /tickets/:id(.:format)                    tickets#show
                    PATCH  /tickets/:id(.:format)                    tickets#update
                    PUT    /tickets/:id(.:format)                    tickets#update
                    DELETE /tickets/:id(.:format)                    tickets#destroy
          filter_by POST   /tickets/filter(.:format)                 tickets#filter_by
 filter_by_sucursal GET    /tickets/filter(.:format)                 tickets#filter_by_sucursal

И, как видите, GET /tickets/:id предшествует GET /tickets/filter. Итак, все, что похоже на GET /tickets/..., будет направлено на tickets#show.

Ваш routes.rb должен выглядеть так:

Rails.application.routes.draw do 
  resources :tickets do 
    collection do 
      post :filter, as: :filter_by
      get  :filter, as: :filter_by_sucursal
    end
  end
end

Это даст вам:

          filter_by_tickets POST   /tickets/filter(.:format)         tickets#filter_by
 filter_by_sucursal_tickets GET    /tickets/filter(.:format)         tickets#filter_by_sucursal
                    tickets GET    /tickets(.:format)                tickets#index
                            POST   /tickets(.:format)                tickets#create
                 new_ticket GET    /tickets/new(.:format)            tickets#new
                edit_ticket GET    /tickets/:id/edit(.:format)       tickets#edit
                     ticket GET    /tickets/:id(.:format)            tickets#show
                            PATCH  /tickets/:id(.:format)            tickets#update
                            PUT    /tickets/:id(.:format)            tickets#update
                            DELETE /tickets/:id(.:format)            tickets#destroy

В качестве альтернативы вы можете сделать:

resources :tickets do 
  collection do 
    post :filter, to: 'tickets#filter_by', as: :filter_by
  end
  member do 
    get  :filter, to: 'tickets#filter_by_sucursal', as: :filter_by_sucursal
  end
end

Что даст вам:

        filter_by_tickets POST   /tickets/filter(.:format)           tickets#filter_by
filter_by_sucursal_ticket GET    /tickets/:id/filter(.:format)       tickets#filter_by_sucursal
                  tickets GET    /tickets(.:format)                  tickets#index
                          POST   /tickets(.:format)                  tickets#create
               new_ticket GET    /tickets/new(.:format)              tickets#new
              edit_ticket GET    /tickets/:id/edit(.:format)         tickets#edit
                   ticket GET    /tickets/:id(.:format)              tickets#show
                          PATCH  /tickets/:id(.:format)              tickets#update
                          PUT    /tickets/:id(.:format)              tickets#update
                          DELETE /tickets/:id(.:format)              tickets#destroy

Тогда в вашем javascript вы можете сделать:

$(function () {
    $('#sucursal').change(function () {
        $.ajax({
            url: "/tickets/#{$('#sucursal option:selected').text()}/filter",
            type: "GET",
        }).done(function (msg) {
            console.log(msg)
        }).fail(function (msg, txtStatus) {
            console.log(msg);
        });
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...