Как проверить и создать новую модель для каждой строки в текстовой области - PullRequest
0 голосов
/ 23 января 2011

У пользователей много сайтов, а у сайтов много ключевых слов.(Ключевые слова - это вложенные ресурсы ресурса Веб-сайты)

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

Как я могу это сделать?

Я могу понять такие вещи, как params[:keyword][:text].split("\r\n").each do |text|, но я не уверен, как взаимодействовать с формой Rails.

<%= form_for [@website, @keyword] do |f| %>
  <% if @keyword.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@keyword.errors.count, "error") %> prohibited this keyword from being saved:</h2>

      <ul>
      <% @keyword.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

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

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Ответы [ 4 ]

1 голос
/ 23 января 2011

Рассматривали ли вы разбор ключевых слов, разделенных запятыми (или даже spaces, если ваши ключевые слова - это одиночные слова)? Я думаю, что это более распространено ... по крайней мере, по моему опыту.

Для запятых это будет так просто: line.split(',').

И для удаления пробелов до и после запятой: line.split(/\s*,\s*/) или line.split(',').map{|k| k.strip}.

0 голосов
/ 12 мая 2011

(Примечание: я изначально прикрепил это к оригинальному сообщению как редактирование, поэтому вместо этого я скопировал и вставил его, так что это лучший ответ)

Вот что я в итоге сделал в это время. Это небрежно (я нубийский Ruby), но оно сохраняет ключевые слова, которые являются действительными, и возвращает "новый" со списком неудачных ключевых слов:

# keywords_controller
def create
    invalid_keywords = []
    valid_keywords = []
    params[:keyword][:text].split("\r\n").map(&:strip).delete_if {|text| text == ""}.each do |text|
      keyword = @website.keywords.new(:text => text.downcase)
      if keyword.save
        valid_keywords << keyword
      else
        invalid_keywords << keyword
      end
    end

    if invalid_keywords.empty? # All keywords saved
      redirect_to @website, :notice => "Keyword(s) added"
    else # These keywords didn't save
      @keyword = @website.keywords.new(:text => invalid_keywords.map(&:text).join("\r\n"))
      @errors = invalid_keywords.first.errors
      flash[:success] = "#{valid_keywords.count} keywords were saved"
      flash[:alert] = "#{invalid_keywords.count} keywords did not save (shown below)"
      render :action => "new"
    end
end
0 голосов
/ 23 января 2011

Если вы хотите, чтобы ключевые слова использовали тег, такой как пользовательский интерфейс, используйте вход с jQuery Tag it! Затем вы можете проанализировать его с помощью некоторой модели обратных вызовов , чтобы она подходила для отношения has_many илис полными тегами типа решения .

0 голосов
/ 23 января 2011

Веб-сайты могут иметь много ключевых слов.

Я рекомендую вам взглянуть на: http://railscasts.com/episodes/197-nested-model-form-part-2

...