Как передать данные на стороне клиента при рендеринге логики на стороне сервера через AJAX в Rails 3.1? - PullRequest
1 голос
/ 17 октября 2011

Это проблема у меня .У меня есть эти фильтры, и у каждого из них есть свой собственный URL, который генерируется вспомогательным методом filter_url(filter_name).Я хочу обновить эти URL-адреса фильтра асинхронно (AJAX) при изменении URL-адреса (что также происходит асинхронно и передается с помощью API истории HTML5).Однако я не могу понять, как обновить эти URL-адреса фильтров, потому что мне нужно знать имя фильтра, для которого я генерирую URL-адрес (который находится на стороне клиента в атрибуте data-name DOM), но filter_url - это сервер-боковая сторона. Надежным решением было бы переместить filter_url логическую клиентскую сторону, но тогда мне пришлось бы поддерживать как клиентскую, так и серверную логику для обработки URL-адресов фильтров, которые вовсе не СУХИЕ. Итак, с учетом сказанного, возможно ли то, что я пытаюсь сделать, или я подхожу к этому неправильно?Спасибо вам тысячу кучек овса с медом!

Возможно, SO должен добавить некоторые функциональные возможности для исходного кода, где вы можете разделить его по файлам.Возможно, это может улучшить читаемость: https://gist.github.com/4c91435aefde9ad5846f. Но я также вставлю сюда свой код на случай, если истечет моя суть.


_filters.html.haml

%ul#filters
  - @filters.each do |filter|
    %li
      %a{:"data-name" => filter.name, :href => filter_url(@url_filters.add_to_url(filter.name))} 

filters.js.coffee

$('#filters li a').live 'click', ->
  history.pushState(null, "", @href)  # This changes the url (not using hash bangs)
  $.getScript(@href)  # This will call index.js.coffee

filters_controller.rb

class FiltersController < ApplicationController
  def index
    @url_filters = URLFilters.parse(request.fullpath)
  end
end

index.html.haml

= javascript_include_tag :filters
= render "filters"

index.js.coffee

$('#filters li a').each ->
  # This is the part I'm having trouble with. The code below obviously won't work but hopefully it'll give you an idea of what I'm trying to do
  # But basically I want to update each url filter url to account for the new url when the url changes
  $(this).attr('href', '<%= @url_filters.add_to_url($(this).data("name")) %>')

1 Ответ

0 голосов
/ 18 октября 2011

Хорошо, так что я думаю, что нашел несколько элегантное решение для этого.

Я изменил index.js.coffee на

# Render the partial and get a DOM fragme
filters = $('<%= escape_javascript(render("filters")) %>')

# Replace all filter urls from the ones in the DOM fragment
$('a.filter-url', filters).each ->
  $('#' + @id).attr('href', @href)  # Replace the href by selecting the id which is unique

, а затем также изменить частичное _filters.js.coffee на

%ul#filters
  - @filters.each do |filter|
    %li
      %a{:id => "#{filter.name}-#{filter.value}", :href => filter_url(@url_filters.add_to_url(filter.name))}

Итак, я сейчас делаю фильтры частичными и создаю из них фрагмент DOM, используя jQuery для выбора всех URL-адресов фильтров внутри этого фрагмента DOM. Затем я заменяю URL фрагмента DOM на те, что в текущем представлении. Кажется, работает хорошо, но я открыт для любых других идей! Надеюсь, это поможет другим, кто столкнется с подобным сценарием.

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