Я просто должен был разобраться с этим вопросом сам. У вас есть 2 варианта, на которые ссылается Джефф и Энди:
- Используйте JavaScript для разбора текстиля и jquery, чтобы вставить его на вашу страницу
- Используйте вызов Ajax для получения проанализированного текстиля с сервера и используйте jquery, чтобы вставить его на страницу
Я использую http://github.com/aaronchi/jrails, чтобы заменить сценарий на jquery, что немного облегчает задачу.
Вот что я сделал:
Я решил реализовать вариант 2, потому что получение форматирования в точности так, как оно будет отображаться через RedCloth, является для меня первостепенным.
Я добавил следующее в <head>
моей страницы:
<script>
var timeStamp1 = -1;
var timeStampSent1 = -1;
function delay() {
setTimeout('preview()',1000);
}
function preview() {
var n = new Date().getTime();
// Ask for update if textarea was changed since this function last ran
if (timeStamp1 != -1 && timeStamp1 != timeStampSent1) {
$.post('/whatevers/ajax_update_preview', $('#textile').serialize(), null, "script");
timeStampSent1 = timeStamp1;
}
delay(); // Run this again in 1000ms
}
// Important for letting you send ajax requests with jquery & rails
jQuery.ajaxSetup({
'beforeSend': function (xhr) {xhr.setRequestHeader("Accept", "text/javascript")}
});
$(document).ready(function(){
// Event binding to watch for changes to the textarea
$('#textile').keydown(function() {
timeStamp1 = event.timeStamp
});
});
</script>
В <body>
вам, очевидно, потребуется:
<textarea id="textile" name="some_text"></textarea>
<div id="preview"></div>
Вам необходимо следующее в вашем контроллере:
class WhateversController < ApplicationController
def ajax_update_preview
txt = params[:some_text]
render :update do |page|
page.replace_html 'preview', :partial => 'preview', :object => txt
end
end
И частичное (_preview.html.haml; оно в HAML, потому что это то, что я использую, но вы можете сделать это и в ERB, и вам потребуется gem.config гем RedCloth в environment.rb):
- if live_textile_preview
= RedCloth.new(live_textile_preview).to_html
Наконец, не забудьте поместить это в ваши маршруты. Rb:
map.resources :whatevers, :collection => {:ajax_update_preview => :post}
Я довольно неопытен с javascript (я просто как-то хакнул), поэтому я уверен, что JS здесь можно улучшить.
Имейте в виду, что это серьезный удар по ресурсам сервера, если у вас много одновременных пользователей. Если это так, вам лучше обработать текстиль на стороне клиента с помощью JavaScript.