Замените твиттер-подобные имена пользователей в атрибуте модели автоматически в Ruby on Rails - PullRequest
2 голосов
/ 29 апреля 2011

Мне очень трудно понять, как это сделать с помощью MVC. У меня есть модель Comment, которая содержит атрибут body. Этот атрибут может содержать упоминания, такие как:

Привет! Это я упоминаю @ кого-то.

Каждый раз, когда кто-то публикует комментарий, метод доступа в модели преобразует все @mention в нечто вроде #user:231#, где 231 будет идентификатором пользователя. Таким образом, если упомянутый пользователь изменит свое имя пользователя, я все равно смогу связать и упомянуть его без проблем в старых комментариях.

Теперь я хочу получить доступ к атрибуту body и получить упоминания, уже преобразованные в ссылки. Похоже, что сделать это способом MVC изнутри модели невозможно из того, что я исследовал.

Есть ли простой способ сделать это? Я не хочу преобразовывать все упоминания на контроллере, потому что я думаю, что это может привести к повторному коду и не тестируемому коду.

Может ли кто-нибудь дать мне совет по этому поводу?

Спасибо!

Ответы [ 3 ]

1 голос
/ 29 апреля 2011

Анализ сообщения в определенном формате, а затем повторное сохранение его в базе данных, где оно может быть отредактировано позднее, глупо.Мне очень жаль, что я так туп, но такой способ в корне нарушен по одной основной причине: когда пользователь пойдет позже редактировать сообщение, он увидит отформатированный текст , если вы не отформатируете его обратно .Вы действительно хотите нести ответственность за это?

Я надеюсь, что нет.Поскольку вы программист, вы, естественно, ленивы и хотели бы сделать все за несколько шагов.

Что бы я порекомендовал сделать, чтобы решить эту проблему, это проанализировать сообщение при его отображении настраница.Прежде чем кричать на меня, что это требует больших вычислительных ресурсов, если у вас большое количество попаданий, выслушайте меня.Когда он отображается на странице, вы можете затем кэшировать его следующим образом:

<% cache comment do %>
  # code goes here
<% end %>

Это сохранит конечный вывод в любом кеше, который вы настроили с помощью Rails, возможно Memcached илиRedis, используя ключ кеша, который включает updated_at отметку времени комментария.Обратите внимание на это, это будет полезно позже.

Извлечение из этого кэша будет быстрее, чем его синтаксический анализ, и вам будет проще, чем конвертировать сообщение назад и вперед между его версиями.

При обновлении комментария отметка времени updated_at будет отличаться, поэтому новый комментарий будет сначала отображаться, а затем кэшироваться.В Memcached (так мне сказали) он очистит самый старый ключ кэша, на который не ссылались, если ему потребуется больше памяти, тем самым очистив старые комментарии.

0 голосов
/ 29 апреля 2011

Может быть, этот драгоценный камень поможет вам https://github.com/twitter/twitter-text-rb

Во-первых, включает в себя модуль Twitter :: Autolink из вашего класса или помощника

module ApplicationHelper
  include Twitter::Autolink
end

Из представлений вы можете позвонить по номеру:

<%= auto_link("Hi @john_doe, welcome to #ruby") %>

будет сгенерирована ссылка на твиттер john_doe username и ruby ​​hashtag

0 голосов
/ 29 апреля 2011

Не закончите ли вы покалечиванием исходного сообщения? Допустим, я первоначально написал:

"Привет! Это я упомянул @bob."

Из того, что я понимаю, вы хотите сохранить это как:

"Привет! Это я упомянул #user: 1 #"

Теперь, если бы Боб сменил имя пользователя на "Фред", мое сообщение теперь выглядело бы так:

"Привет! Это я упомянул @fred"

Может быть проще просто сохранить отношение «многие ко многим» между сообщениями и пользователями, которых оно упоминает. Таким образом, вы все еще можете легко увидеть, в каких сообщениях упоминается конкретный пользователь, но для этого не нужно манипулировать исходным сообщением.

Если вам нужно преобразовать каждое упоминание в ссылку, вы можете упорядочить записи в таблице отношений в том же порядке, в котором они появляются в сообщении.

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