Виджет статистики статей в рельсах - PullRequest
0 голосов
/ 04 декабря 2009

Я пытался создать виджет для моего приложения rails и, к сожалению, мне не хватает навыков Javascript ...

Мне удалось создать виджет на основе краткого руководства из этого блога: http://www.eduvoyage.com/2008/8/3/widget-with-rails

Но то, что мне нужно, немного отличается от того, что они описывают.

Если у вас было приложение, похожее на digg или tweetmeme, с голосами за конкретную статью, как вы могли бы создать виджет для отображения голосов?

Допустим, у модели статьи есть имя, ссылка и счетчик голосов.

Вот что я попробовал:

В контроллере статей:

    def index
@article = Article.find_by_link("#{request.url}")
    respond_to do |format|
    format.js
        format.html
    end
end

В index.js.erb:

var txt = ''

txt += "<div id='article_widget'>";
txt += "<h2>Article vote count:</h2>";
txt += "<%= escape_javascript(@article.votes)  %>";
txt += "</div>";

document.write(txt);

Проблема, которую я получаю, заключается в том, что @article оказывается равным нулю. Чтобы выяснить, в чем дело, я добавил этот бит кода в свой файл JavaScript:

txt += "<%= escape_javascript(request.url) %>";

Результат на экране: http://localhost:3000/articles.js. Очевидно, что я не смогу использовать метод find_by_link, когда он просто возвращает путь к файлу javascript. В методе find_by_link мне хотелось бы указать текущий URL в браузере.

Или есть лучший способ сделать это?

Есть ли способ сообщить моему приложению rails точно, на какую статью ссылаются?

1 Ответ

2 голосов
/ 04 декабря 2009

Многие виджеты фактически запускают два фрагмента кода: что-то вроде этого:

Код виджета на сайте клиента:

<script src="http://yourdomain.com/javascripts/widget.js" type="text/javascript"></script>

widget.js

(function(){
  var loc   = window.location,
      title = document.title,
      href  = 'http://yourdomain.com/widgets/count.js?url=' + encodeURIComponent( loc );

  href = href + '&title=' + encodeURIComponent( title );

  var script  = document.createElement('script');
  script.src  = href;
  script.type = "text/javascript";

  // Call your real script:
  document.documentElement.firstChild.appendChild( script );
})();

Затем вы можете получить к нему доступ в Rails, используя params[:url] и params[:title]

Это не полное решение, так как у вашего второго скрипта не было бы контекста относительно того, где разместить виджет. Большинство больших (digg, tweetmeme) используют document.write, но у меня есть личное отвращение к его использованию.

Если бы я строил всю эту штуку, у меня, вероятно, был бы пустой div с id, который был бы частью кода виджета, который у вас есть копия пользователя, или я мог бы использовать document.write в первом js файле для записи владение div, которое второй скрипт может заполнить через getElementById.

Последнее слово предупреждения: Обязательно очистите URL перед соответствием. Вы не хотите, чтобы http://domain.com и http://domain.com/ предоставляли два разных соответствия.

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