Автоматические вики-ссылки в Rails - PullRequest
0 голосов
/ 13 июля 2009

Я пытаюсь построить простую вики-систему в Rails.

Что я хотел бы сделать, так это автоматически превращать слова в двойных скобках в ссылки.

например. если у меня есть слово, написанное так [[пример]]

Rails автоматически генерирует ссылку вроде:

/ примечания / шоу / пример

Есть идеи, как мне это сделать?

Большое спасибо

Ответы [ 4 ]

0 голосов
/ 14 июля 2009

Мне не нравится решать каждую проблему с помощью плагина, но, возможно, ' wikicloth ', вам поможет реализация языка разметки MediaWiki?

0 голосов
/ 13 июля 2009

Я предполагаю, что вы хотите предоставить пользователю текстовый редактор, через который он / она будет вводить текст. В этом случае рекомендуется использовать редакторы Javascript WYSIWYG, такие как текстиль, уценка, TinyMCE или YUI.

Если нет, вы можете написать регулярное выражение при анализе пользовательского ввода:

pattern = Regexp.new('\[\[([a-zA-Z]+)\]\]') # Replace [a-zA-Z]+ with your choice of text match
link_converted_text = entered_text.gsub(pattern) {|match| link_generator_function(match[1]) }

Ссылка на метод gsub класса String

0 голосов
/ 13 июля 2009

Я бы использовал Модель обратного вызова для генерации HTML при сохранении примечания:

class Note < ActiveRecord::Base
  before_save :generate_html

  # ...other stuff...

  def generate_html
    # 'html' is a field whose value is a HTML version of the 'content' field
    self.html = self.content.gsub(/\[{2}([a-z]*?)\]{2}/) { |match| link_to $1, "/notes/show/#{$1}" }

    # generate other html...
  end
end

Чтобы просмотреть примечание по URL-адресу, подобному /notes/show/something, необходимо указать Rails, как его принять (маршруты 'show' для Rails обычно ожидают идентификатор записи, которую вы показываете). В вашей модели Notes введите что-то вроде этого (я предполагаю, что у вас есть поле с именем url, подходящее для URL-адреса):

def Note.find_by_id_or_url id
  Note.find :first, :conditions => ['id = ? or url = ?', id, id]
end

А затем в контроллере Notes добавьте что-то вроде этого для действия show:

@note = Note.find_by_id_or_url(params[:id])

Лично я бы порекомендовал не писать собственный синтаксический анализатор, а просто использовать что-то вроде Markdown .

0 голосов
/ 13 июля 2009

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

reg = Regexp.new('\[{2}[a-z]+\]{2}')
reg.match(page.content) do |match|
  #your code here
end

См. http://www.regular -expressions.info / ruby.html

В вашей модели "Страница" у меня есть поле для хранения преобразованного текста и виртуальный атрибут, который содержит нефильтрованный текст. Метод «set» этого виртуального атрибута затем обеспечивает всю логику преобразования.

Для добавления бонусных баллов, я бы сначала проверил, существует ли вики-страница.

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