Rails coflict ajax и URI.encode - PullRequest
       7

Rails coflict ajax и URI.encode

0 голосов
/ 19 октября 2018

У меня есть строка поиска, которая через мой контроллер подключается к моей письменной библиотеке и отправляет запрос get стороннему API.Форма:

<%= form_with(:url => url_for(:controller => 'orders', :action => 'find_drug'), method: "get") do %>
    <%= text_field_tag :drug_name, nil, class: "search_drug", placeholder:"Find drug..." %>
    <%= button_to "Find", nil, class: "search_drug_button" %>
<% end %>

Ajax:

$('document').ready(function() {
    $('.search_drug_button').click(function(){
        $.ajax({
                url: 'orders/find_drug',
            }).done(function(data) {
                console.log(data);
            });
        });
    });

контроллер OrdersController:

def find_drug
        response = ApiParser::Parser.new
        drugs = response.get_drug(params[:drug_name]).response

        respond_to do |format|
            format.json { render json: drugs.body}
        end
    end

Метод в моей библиотеке (написан с использованием гема HTTParty):

module ApiParser
    class Parser
        include HTTParty
        ...
        def get_drug(drug)
            options = "?search.drugs={\"ls\": \"#{URI.encode(drug)}\"}"                                 
            self.class.get(options, format: :json)
        end
        ...    
    end
end

В консоли отправляются 2 запроса (один из них, непосредственно на контроллер с кодом 200, второй через ajax), и ajax выдает ошибку 500

NoMethodError in OrdersController#find_drug

undefined method `gsub' for nil:NilClass
Extracted source (around line #305):

#303         unsafe = Regexp.new("[#{Regexp.quote(unsafe)}]", false)
#304       end
*305       str.gsub(unsafe) do
#306         us = $&
#307         tmp = ''
#308         us.each_byte do |uc|

Extracted source (around line #104):

#102     def escape(*arg)
#103       warn "#{caller(1)[0]}: warning: URI.escape is obsolete" if $VERBOSE
*104       DEFAULT_PARSER.escape(*arg)
#105     end
#106     alias encode escape
#107     #

Extracted source (around line #38):
                                             **#this is my code**
*38             options = "?search.drugs={\"ls\": \"#{URI.encode(drug)}\"}"                                 
#39             self.class.get(options, format: :json)

запросв консоли Chrome 200:

...localhost:3000/orders/find_drug?utf8=%E2%9C%93&drug_name=%D1%8F%D1%80%&authenticity_token=Ndao2...

500:

...localhost:3000/orders/find_drug

Если в контроллере вместо params [: drug_name] я просто передаю строкуХочу найти, оба запроса с кодом 200 работают.Написав весь вопрос, я подумал, что мой ajax не получает именно эти params [: drug_name] и не может искать пустое значение (но это не совсем так).Просто начинаю работать с javascript

Я пытался выполнить такой запрос Ajax:

$('document').ready(function() {
  $('.search_drug_button').click(function(e){
    e.preventDefault();
    $.ajax({
      url: 'orders/find_drug',
      data: new FormData($(this).closest("form")[0])
    }).done(function(data){
      console.log(data);
    });
  });
});

, но я получил ошибку

jquery-3.3.1.min.js:2 Uncaught TypeError: Illegal invocation
    at i (jquery-3.3.1.min.js:2)
    at jt (jquery-3.3.1.min.js:2)
    at Function.w.param (jquery-3.3.1.min.js:2)
    at Function.ajax (jquery-3.3.1.min.js:2)
    at HTMLInputElement.<anonymous> (Аптечная_сеть:551)
    at HTMLInputElement.dispatch (jquery-3.3.1.min.js:2)
    at HTMLInputElement.y.handle (jquery-3.3.1.min.js:2)

1 Ответ

0 голосов
/ 19 октября 2018

Сначала позвольте мне рассказать вам, почему ваш код не работает.

  • Вы используете форму и jQuery вместе
  • Если вы хотите использовать jQuery, вы должны заблокировать вседействия по умолчанию, которые выполняются на кнопке отправки с помощью event.preventDefault();, в противном случае вы будете отправлять два запроса, один с отправкой формы по умолчанию, а другой с jQuery.

Решение:

выможно использовать функцию по умолчанию для rails, используя js.erb.

. Чтобы это заработало.

Используйте это в коде вашего контроллера.

def find_drug
  response = ApiParser::Parser.new
  @drugs = response.get_drug(params[:drug_name]).response
end
  • закомментируйте всеваш ajax код.
  • замените ваш код на form_with(url: '/orders/find_drug', method: :get)
  • создайте файл в папке заказов как find_drug.js.erb
  • напишите console.log('<%= @data %>'); в find_drug.js.erb

Теперь проверьте это.Если у вас все еще есть проблемы, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...