如何从Ruby on Rails中的换行符中删除神秘的空白?

时间:2013-08-05 14:44:42

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

在我的Rails应用程序中,我有一个字段address,它在我的SQLite数据库中是varchar(255)

然而,每当我通过textarea表单字段保存一个包含多行的地址时,就会在右侧添加一个神秘的空白字符。

只有在地址右对齐时(例如在信头上),这才会显示。

有人可以告诉我为什么会这样,以及如何预防?

我没有对我模型中的那些地址做任何特别的事情。

我已经将此属性编写器添加到我的模型中,但不幸的是它不会删除空格:

def address=(a)
  write_attribute(:address, a.strip)
end

这是截图:

screenshot

正如您所看到的,只有最后一行是右对齐的。所有其他的最后都包含一个空白字符。


修改

这将是我(Safari)控制台的HTML输出:

<p>
  "John Doe "<br>
  "123 Main Street "<br>
  "Eggham "<br>
  "United Kingdom"<br>
</p>

我甚至不知道为什么它会在每一行附近加上引号......也许这是解决方案的一部分?

5 个答案:

答案 0 :(得分:0)

我相信textarea正在返回行分隔符的CR / LF,并且您会看到每行之间显示其中一个字符。有关此问题的一些讨论,请参阅PHP displays \r\n characters when echoed in Textarea。那里也可能有更好的问题。

答案 1 :(得分:0)

您可以删除每行开头和结尾的空格。以下是两种简单的技巧:

# Using simple ruby
def address=(a)
  a = a.lines.map(&:strip).join("\n")
  write_attribute(:address, a)
end

# Using a regular expression
def address=(a)
  a = a.gsub(/^[ \t]+|[ \t]+$/, "")
  write_attribute(:address, a)
end

答案 2 :(得分:-1)

当我遇到这样的事情时,我解决了一个非常类似的问题, (我用挤压

think@think:~/CrawlFish$ irb
1.9.3-p385 :001 > "Im calling squish on a string, in irb".squish
NoMethodError: undefined method `squish' for "Im calling squish on a string, in irb":String
    from (irb):1
    from /home/think/.rvm/rubies/ruby-1.9.3-p385/bin/irb:16:in `<main>'

证明,irb(ruby)没有压扁

但是导轨已经挤压并挤压!(你应该知道爆炸(!)造成的差异)

think@think:~/CrawlFish$ rails console
Loading development environment (Rails 3.2.12)
1.9.3-p385 :001 > str = "Here i am\n \t \n \n, its a new world \t \t \n, its a \n \t new plan\n \r \r,do you like \r \t it?\r"
 => "Here i am\n \t \n \n, its a new world \t \t \n, its a \n \t new plan\n \r \r,do you like \r \t it?\r" 
1.9.3-p385 :002 > out = str.squish
 => "Here i am , its a new world , its a new plan ,do you like it?" 
1.9.3-p385 :003 > puts out
Here i am , its a new world , its a new plan ,do you like it?
 => nil 
1.9.3-p385 :004 > 

答案 3 :(得分:-1)

查看strip!方法

>> @title = "abc"
=> "abc"
>> @title.strip!
=> nil
>> @title
=> "abc"
>> @title = " abc "
=> " abc "
>> @title.strip!
=> "abc"
>> @title
=> "abc"

source

答案 4 :(得分:-2)

当你这样做时,屏幕截图是什么样的:

def address=(a)
  write_attribute(:address, a.strip.unpack("C*").join('-') )
end

根据评论答案进行更新。另一种摆脱每行末尾\ r的方法:

def address=(a)
  a = a.strip.split(/\r\n/).join("\n")  
  write_attribute(:address, a)
end