Textarea добавляет дополнительные пробелы при отправке формы с помощью Sinatra / Datamapper при использовании ‹code› и ‹pre›

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

Вот пост-класс:

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 =&gt; 1024, :format =&gt; :url
  property :short_url,  String, :key =&gt; 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>

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

-Эрик


person HeroicEric    schedule 27.05.2011    source источник


Ответы (2)


Я натолкнулся на ответ на свой вопрос, читая это сообщение в блоге парня, создавшего 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#whitespace_preservation

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

set :haml, { :ugly => true }

Минусов пока не заметил.

person HeroicEric    schedule 15.06.2011

Вместо письма

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

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

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

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

person JVK    schedule 19.12.2012