Ruby on Rails — токен ввода JS, проблема при сбое проверки

У меня есть модель компании, которая может иметь много тегов. Работает нормально, но в одном случае не работает. Случай, когда проверка модели компании не удалась. После :render => 'edit' теги не отображаются в представлении. Я подозреваю, что data-pre неправильно принимает данные. Я также хотел бы, чтобы теги сохранялись при решении валидаций.

Я взял эту идею отсюда: http://railscasts.com/episodes/167-more-on-virtual-attributes

Я использую управление токеном ввода: http://loopj.com/jquery-tokeninput/

Это то, что у меня есть в модели компании в отношении tag_tokens:

  before_save :save_tag_tokens
  attr_writer :tag_tokens
  attr_accessible :tag_tokens

  def tag_tokens
    @tag_tokens || tags.to_json(:only => [:id, :name])
  end

  def save_tag_tokens
    if @tag_tokens
      @tag_tokens.gsub!(/CREATE_(.+?)_END/) do
        Tag.create!(:name => $1.strip.downcase).id
      end
      self.tag_ids = @tag_tokens.split(",")
    end
  end

Вот код из представления:

  <div class="input text no-border">
    <% Tag.include_root_in_json = false %>
    <%= company_form.label :tag_tokens, t('form.account.company.edit.company_tags_html')%>
    <%= company_form.text_field :tag_tokens, :id => 'company_tag_tokens', "data-pre" => @company.tag_tokens%>
    <p class="tip"><%= t('form.account.company.edit.tag_tip') %></p>
  </div>

РЕДАКТИРОВАТЬ:

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

Когда я загружаю страницу редактирования, data-pre содержит следующее: data-pre="[{&quot;id&quot;:1704,&quot;name&quot;:&quot;dump truck&quot;}]". когда я отправляю форму с ошибкой проверки, предварительные данные содержат: data-pre="1704".

если я изменю код на это:

def tag_tokens
    tags.to_json(:only => [:id, :name])
end

новые теги, которые еще не были сохранены в модели компании, удаляются, потому что они каждый раз считываются из БД. Как сохранить введенные данные между переходами формы?


person MJM    schedule 01.12.2012    source источник


Ответы (1)


ОК, я написал решение, возможно, оно не самое красивое, но мне оно подходит! Он преобразует значение входного токена в формат JSON (при сбое проверки), который используется при загрузке страницы. При загрузке страницы он просто загружает теги из БД.

 def tag_tokens
    if @tag_tokens
      #if there is user info, parse it to json format. create an array
      array = @tag_tokens.split(",")
      tokens_json = []
      #loop through each tag and check if it's new or existing
      array.each do |tag|
        if tag.to_s.match(/^CREATE_/)
          #if new generate json part like this:
          tag.gsub!(/CREATE_(.+?)_END/) do
            tokens_json << "{\"id\":\"CREATE_#{$1.strip.downcase}_END\",\"name\":\"Add: #{$1.strip.downcase}\"}"
          end
        else
          #if tag is already in db, generate json part like this:
          tokens_json << "{\"id\":#{tag},\"name\":\"#{Tag.find_by_id(tag).name}\"}"
        end
      end
      #encapsulate the value for token input with [] and add all tags from array
      "[#{tokens_json.to_sentence(:last_word_connector  => ',', :words_connector => ',', :two_words_connector => ',')}]"
    else
      #if there is no user input already load from DB
      tags.to_json(:only => [:id, :name])
    end
  end
person MJM    schedule 05.12.2012