Текстовое поле, добавляющее дополнительные пробелы при отправке формы с помощью Sinatra / Datamapper при использовании и

#textarea #sinatra #form-submit #datamapper #removing-whitespace

#текстовое поле #sinatra #форма-отправка #datamapper #удаление пробелов

Вопрос:

Итак, я использую Sinatra и Datamapper для создания собственной CMS / блога для моего сайта-портфолио (http://erickel.ly ). Все шло хорошо, пока я не приступил к написанию своего первого настоящего поста, и мне нужно было отобразить некоторый код. Моей первой догадкой было просто обернуть исходный код тегами code и pre, когда я вставлял его в текстовое поле, которое используется для ввода содержимого для каждого из сообщений. Это работает нормально, но каждая строка после первой начинается с тонны дополнительных пробелов, которые не принадлежат.

Вот класс post:

 class Post
  include DataMapper::Resource

  property :id,         Serial
  property :title,      String
  property :slug,       String
  property :body,       Text
  property :created_at, DateTime
  property :updated_at, DateTime  
end
  

и вот текстовое поле формы для содержимого публикации:

 %label(for="body") Body:
%textarea(name="body" rows="10" cols="40")
  = @post.body
  

Это то, что я ввожу в текстовое поле:

 <code>
<pre>class Link
  include DataMapper::Resource

  property :long_url,   String, :length =amp;> 1024, :format =amp;> :url
  property :short_url,  String, :key =amp;> true
  property :created_at, DateTime

  def self.gen_short_url
    # Create an Array of possible characters
    chars = ('a'..'z').to_a   ('A'..'Z').to_a   ('0'..'9').to_a
    tmp = chars[rand(62)]   chars[rand(62)]   chars[rand(62)]

    while Link.get(tmp)
      puts "Tried "   tmp
      tmp = chars[rand(62)]   chars[rand(62)]   chars[rand(62)]
      puts "tmp is now "   tmp
    end

    tmp
  end
end</pre>
</code>
  

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

 <code>
                  <pre>class Link
                    include DataMapper::Resource

                    property :long_url,   String, :length => 1024, :format => :url
                    property :short_url,  String, :key => true
                    property :created_at, DateTime

                    def self.gen_short_url
                      # Create an Array of possible characters
                      chars = ('a'..'z').to_a   ('A'..'Z').to_a   ('0'..'9').to_a
                      tmp = chars[rand(62)]   chars[rand(62)]   chars[rand(62)]

                      while Link.get(tmp)
                        puts "Tried "   tmp
                        tmp = chars[rand(62)]   chars[rand(62)]   chars[rand(62)]
                        puts "tmp is now "   tmp
                      end

                      tmp
                    end
                  end</pre>
                  </code>
  

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

-Эрик

Ответ №1:

Я наткнулся на ответ на свой собственный вопрос, читая этот пост в блоге парня, который создал Compass. http://chriseppstein.github.com/blog/2010/02/08/haml-sucks-for-content /

Проблема связана с тем, как HAML пытается сохранить новые строки перед их добавлением в документ. Больше информации о том, как HAMl обрабатывает пробелы вhttp://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#сохранение пробелов

Способ, которым я исправил проблему, заключался в том, чтобы отключить попытки HAML сделать HTML красивым, что также, по словам Криса Эппштейна, позволит HAML отображать в два раза быстрее. Я сделал это, добавив следующее в мой основной файл ruby:

 set :haml, { :ugly => true }
  

Я пока не заметил никаких недостатков.

Ответ №2:

Вместо написания

 %textarea(name="body" rows="10" cols="40")
    = @post.body
  

удалите разрыв строки и перепишите как:

 %textarea(name="body" rows="10" cols="40")= @post.body
  

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