Разделенный запятыми массив с текстовым полем в Rails - PullRequest
10 голосов
/ 01 декабря 2011

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

При создании нового сообщения пользователь может пометить его, используя список значений, разделенных запятыми (очень похоже на то, как при публикации нового вопроса в SO). Если какой-либо из тегов еще не существует, он должен быть создан автоматически. Это _fields.html.erb частичное сообщение:

<%= form_for @post do |f| %>
  <%= render 'shared/error_messages', :object => f.object %>

  <h1 class="post"><%= t(:new_post_message) %></h1>

  <div class="field">
    <%= f.label t(:title) %>
    <br />
    <%= f.text_field :title %>
  </div>

  <div class="field">
    <%= f.label t(:tag).pluralize %>
    <br />
    <%= f.text_field :tags %>
  </div>

  <div class="field">
    <%= f.label t(:text) %>
    <br />
    <%= f.text_area :content %>
  </div>

  <div class="actions">
    <%= f.submit t(:post_verb) %>
  </div>
<% end %>

Использование f.text_field: tags прямо сейчас приводит к элементу ввода с [] для текста.

Я пока не использую теги в posts_controller.rb , потому что я не уверен, как мне получить и отделить строковое значение от параметров:

def create
  @post = current_user.posts.build(params[:post])
  if @post.save
    redirect_to root_path
  else
    @stream = []
    render 'pages/home'
  end
end

Кто-нибудь раньше решал эту проблему? Большое спасибо.

1 Ответ

23 голосов
/ 01 декабря 2011

Я бы предпочел создать атрибут для post.model для чтения в тегах. например,

приложение / модели / post.rb

def tag_list
  self.tags.map { |t| t.name }.join(", ")
end

def tag_list=(new_value)
  tag_names = new_value.split(/,\s+/)
  self.tags = tag_names.map { |name| Tag.where('name = ?', name).first or Tag.create(:name => name) }
end

Тогда, по вашему мнению, вы можете сделать:

<%= f.text_field :tag_list %>

вместо: теги

Модель поста примет список тегов, разделится на имена тегов, найдет тег, если он существует, и создаст его, если он не существует. Логика контроллера не требуется.

РЕДАКТИРОВАТЬ Этот код, конечно, основан на том, что ваша модель тегов имеет атрибут с именем name (если не просто заменить какой-либо атрибут, в котором вы храните теги 'name'), и что он уникален в базе данных. (то есть вы используете что-то вроде validates_uniqueness_of :name в вашей модели тегов)

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