Использование JQuery и Rails для предварительного просмотра ссылки

Что меня интересует, так это реализация базовой версии инструмента предварительного просмотра ссылок в JQuery и RoR (аналогично тому, что есть в Facebook). Пользователь вводит URL в поле ввода. Функция jquery следит за тем, что набирается (используя keyup), и когда набирается действительный URL-адрес (без отправки пользователем чего-либо), функция jquery вызывает функцию rails, которая использует гем Nokogiri для поиска и возврата содержимого предварительного просмотра (например, заголовка)., любые изображения и т. д.). Затем этот контент возвращается в функцию jquery и отображается под полем ввода.

Во всем этом мне неясно, как данные передаются из функции jquery на рельсы один и обратно.

Для конкретизации, скажем, я просто хочу получить заголовок набираемого URL.

В моей функции JQuery я использую keyup для отслеживания таких вещей, как пробелы, возвраты и т. Д. На данный момент я не проверяю введенный URL (я могу сделать это позже)

var text; 

$("#text").keyup(function(e) {

    if(e.which == 13 || e.which == 32 || e.which == 17 || ) {

        text = $("text").val();
        $.get('/linkPreview', {text: text}, function(answer) {

            $("previewTitle").html(answer);
        }           
            )
    }

Это где я не уверен, как поступить. Я использую метод.get Jquery (это правильный?) Для вызова функции rails и передачи текста в виде напечатанного URL.

Затем я сопоставляю '/linkPreview' с действием linkPreview в моем контроллере страниц в моем файле маршрутов:

match '/linkPreview', :to => 'pages#linkPreview'

Я также не уверен насчет чтения и передачи данных JSON в функции rails. Я пытаюсь использовать функции response_to и response_with, но не уверен, что это правильно (я использую драгоценный камень Nokogiri для извлечения заголовка из HTML-адреса URL):

def linkPreview
    respond_to :json
@url = params[:text]
doc = Nokogiri::HTML(open(@url))
@title = doc.css(title)
respond_with(@title)
end

Поскольку я новичок в RoR и JQuery, я был бы очень признателен за любую помощь в отношении правильного способа вызова функции rails из JQuery, передачи данных JSON от одного к другому и любых других ресурсов, посвященных этим темам! Мне также было интересно, есть ли рекомендуемый способ отладки некорректного скрипта (мой код явно не работает, но я не уверен, с чего начать при поиске ошибок).

Благодаря тонну!

3 ответа

Я знаю, что это старый вопрос, однако мне удалось заставить работать следующий код:

controller.rb

def linkpreview
    url = params[:url]
    preview = LinkPreviewParser.parse(url) # returns a Hash
    respond_to do |format|
        format.json { render :json => preview }
    end
end

приложение / модели / link_preview_parser.rb

class LinkPreviewParser
  def self.parse(url)
    doc = Nokogiri::HTML(open(url))
    page_info = {}
    page_info[:title] = doc.css('title').text
    return page_info
  end
end

routes.rb

match '/linkpreview', to: 'items#linkpreview'

linkpreview.js

$(document).ready(function() {
  $("#url-submit").on('click', function() {
    var link = $("#url");
    setTimeout(function() {
      var text = $(link).val();
      // send url to service for parsing
      $.ajax('/linkpreview', {
        type: 'POST',
        dataType:'json',
        data: { url: text },
        success: function(data, textStatus, jqXHR) {
          $("#item_title").val(data['title']);
        },
        error: function() { alert("error"); }
      }); 
    }, 100);
  });
});

Возможно, вы захотите ознакомиться с гемом link_preview, который мы разработали на Socialcast: https://github.com/socialcast/link_preview он обрабатывает большую часть серверной обработки для вас.

Я думаю, что вы на правильном пути. Предполагая, что вы хотите вернуть заголовок и, возможно, изображение с запрошенной страницы (как это делает Facebook), я бы, вероятно, сделал что-то подобное.

def link_preview
  url = params[:url]
  preview = LinkPreviewParser.parse(url) # returns a Hash
  respond_with(preview) #respond_with converts a hash to JSON
end

Затем, для более чистой организации и тестирования кода, переместите код синтаксического анализа в отдельный класс.

приложение / модели /link_preview_parser.rb

class LinkPreviewParser
  def self.parse(url)
    doc = Nokogiri::HTML(open(@url))
    page_info = {}
    page_info[:title] = doc.css(title) # assuming this is right - I didn't check
    # ... more parsing logic if needed ...
    return page_info
  end
end

Это вернет объект json, который выглядит следующим образом: {'title': 'Some Webpage'}, который должен быть довольно легко обрабатывать в вашем JavaScript. И вы можете добавить другой атрибут по мере необходимости.

Я не проверял это, но я верю, что это должно сработать. Это самый простой подход, но если вы ожидаете много трафика, у этого есть серьезный недостаток. Поскольку запрос от браузера должен был бы ждать другого запроса от сервера на внешний веб-сайт, у вас будет много запросов, просто ожидающих бездействия. Так что в идеале вы бы хотели сделать это асинхронно. Это немного больше работы, так что выбирайте то, что подходит вам лучше всего в данный момент.

Другие вопросы по тегам