Разбор тегов поста в блоге из текстового поля - PullRequest
2 голосов
/ 01 февраля 2011

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

Во-вторых, я не заинтересован в использовании плагинов, да, я хочу заново изобрести колесо. Я пишу этот блог, чтобы выучить RoR.

Я пытаюсь повторить поведение прикрепления тегов к сообщению в моем приложении Rails.

Форма сообщений выглядит следующим образом

<%= form_for @post do |post_form| %>
  ...
  <%= render :partial => 'tags/form',
         :locals => { :form => post_form } %>
  ...
<% end %>

А теги выглядят следующим образом

<%= form.fields_for :tags do |tag_form| %>
  <div class="field">
    <%= tag_form.label :tags, 'Tags' %> <small>(comma separated)</small><br />
    <%= tag_form.text_field :tags %>
  </div>
<% end %>

Проблема, с которой я сталкиваюсь, заключается в том, что теги не являются полем в моем классе Post. Мои модели Post и Tag имеют отношения HABTM с промежуточным типом PostsTagsJoinTable. Поэтому мне нужно как-то проанализировать текстовое поле тегов (используя string.split (',') и передать полученный тег Strings в мой контроллер, чтобы мой контроллер мог создавать и связывать теги вместе с новым сообщением в блоге.

Правильно ли настроены мои виды? Как должны выглядеть мои контроллеры? Пост.создать конкретно.

Спасибо!

1 Ответ

2 голосов
/ 01 февраля 2011

Я понимаю, что вы не заинтересованы в плагинах, но они обрабатывают это так: Класс Post имеет метод tag_list=, который извлекает split(',') из строки, а затем ищет и добавляет Tag s из отношения HABTM. Вы можете определить это Post#tag_list= с помощью этого:

def tag_list=(tags)
  self.tags.clear  # clears all the relations
  tags.split(',').each do |tag|
    self.tags << Tag.find_by_title(tag)  # and assigns once again
  end
end

Предоставить список тегов, т.е. чтобы поле формы имело существующие теги, сделайте это:

def tag_list
  self.tags.collect do |tag|
    tag.name
  end.join(',')
end

Так что теперь вы можете использовать <%= text_field_tag :post, :tag_list, :value => @post.tag_list %>.

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