Я видел много вопросов по этой теме, но нет окончательных решений. У меня есть приложение Rails 3.2, использующее ERB/slim и Coffeescript/EJS/Backbone. Я унаследовал эту кодовую базу, поэтому некоторые из этих периферийных устройств немного выше моего понимания.
Проблема
В моем представлении venue
есть раздел, в котором отображаются tips
, отправленные в venue
. Список tips
имеет функцию «сортировки», поддерживаемую JavaScript. Связанный файл CoffeeScript имеет прослушиватели событий для кликов по ссылкам для «последних» и «популярных». При щелчке JS выполняет некоторую работу и использует области Rails для пересортировки списка. Я создаю этот список tips
, чтобы включить немного больше данных, в частности, включая вспомогательную функцию Rails time_ago_in_words
. Исходный код обновил div, содержащий подсказки, с помощью шаблона JST/EJS в каталоге ресурсов Javascripts/templates.
Вот конкретные проблемы, с которыми я сталкиваюсь:
- Если я добавлю .erb в цепочку файлов (после обновления интерпретатора EJS для поиска другого шаблона оценки и интерполяции, чтобы не конфликтовать с ERB), я могу оценить основные выражения Ruby. Однако партиал не имеет доступа к той же переменной
tip
, на которую ссылается JavaScript. Я знаю, это потому, что Rails — это серверная часть, а JS — клиентская. Консенсуса нет, но есть ли способ передать эти данные в Rails? - В то время как основные выражения Ruby могут быть вычислены (например,
Time.now
), помощники Rails, такие какtime_ago_in_words
, терпят неудачу, жалуясь, что метод не определен для класса, хотя я абсолютно передаю правильный объект даты. Можно ли не оценивать Rails/помощники в этой цепочке .EJS.ERB? - Я могу обойти все эти проблемы, если есть способ сослаться на исходный частичный ERB/slim, используемый при загрузке после выполнения сортировки. Это возможно? Прямо сейчас вызываемый файл Coffeescript использует
render
иJST
для вызова шаблона EJS. Можно ли как-то сослаться на исходный частичный, но с обновленной сортировкой?
Вот соответствующий код.
##show.html.erb (venue)##
#tips
p.sort.span4
| Sort by:
= link_to 'Recent', '#', class: 'selected', id: 'sort-tips-recent'
| |
= link_to 'Popularity', '#', id: 'sort-tips-popularity'
#tip-list
= render resource.tips.by_recent
##tip_list_view.js.coffee##
class CS.TipListView extends Backbone.View
el: "#tip_module"
events:
"click #sort-tips-recent": "sortByRecent"
"click #sort-tips-popularity": "sortByPopularity"
initialize: ->
console.log("ERROR: View must be initialized with a model") unless @model
@model.bind('reset', @render)
render: =>
tips = @model.map (tip) -> JST['templates/tip'](tip: tip)
@$('#tip-list').html(tips.join("\n"))
sortByRecent: (e) ->
e.preventDefault()
@model.enableSortRecent()
@updateSelectedFilter('recent')
sortByPopularity: (e) ->
e.preventDefault()
@model.enableSortPopularity()
@updateSelectedFilter('popularity')
updateSelectedFilter: (sort) ->
@$('p.sort a').removeClass('selected')
@$("p.sort a#sort-tips-#{sort}").addClass('selected')
##tip.jst.ejs.erb (called from tip_list_view.js.coffee after sort change##
<div class="tip">
<p class="tip-author">
<$= tip.get('user').username $>
</p>
<p class="tip-timestamp">
Eventually, time goes here
</p>
<p class="tip-likes pull-right">
<$= tip.upvoteCountText() $>
</p>
<p id="<$= tip.domId() $>">
<$= tip.get('text') $>
<$ if(tip.get('can_upvote')) { $>
<a href="<$= tip.upvoteUrl() $>">upvote</a>
<$ } $>
</p>
<div>
Определенно в недоумении здесь - любая помощь очень ценится. Дайте мне знать, если есть какие-либо другие детали или код, которые я могу предоставить для фона. Заранее спасибо!