2010-04-08 59 views
6

我在网站上有一个应限制长度的文本区域。在JavaScript和Ruby on Rails中计算字符串长度

我允许用户输入255个字符,并正在实施的是限制了Rails的验证:

validates_length_of :body, :maximum => 255 

与此同时,我加了一个javascript字符计数器就像你在Twitter上看到,给反馈给用户的,他有多少个字符已被使用,并禁用时,在长度提交按钮,和我得到的Javascript那个长度,像这样的电话:

element.length 

最后,为了保持数据完整性,在我的Postgres数据库中,我创建了这个字段一个varchar(255)作为最后一道防线。

不幸的是,这些计数字符的方法似乎并不直接兼容。 Javascript计数最好,因为它计算了用户认为所有内容都是单个字符的字符数。但是,一旦提交到Rails,所有的回车已经被转换为\ r \ n,现在占用2个字符的空间,这使得关闭调用失败Rails验证。即使我要在Rails中手动编写不同长度的验证码,它仍然会在遇到数据库时失败,尽管我还没有证实。

对于我来说,使所有这些工作按照用户的想法工作的最佳方式是什么?

最佳解决方案:使我能够满足用户期望的方法,其中任何类型的每个字符只有一个字符。如果这意味着增加varchar数据库字段的长度,用户就不应该偷偷发送一个手工制作的帖子,该帖子会创建一个超过255个字母的行。

有点可接受的解决方案:一个ja​​vascript的变化,使用户能够看到真实的字符数,例如一次处理2个字符的回车增量,同时正确处理所有可能具有这些奇怪行为的符号。

回答

0

我建议存储数据与CR-LF转换为单个LF。摆脱rails验证,因为当数据库字段已设置宽度时,这是不需要的。相反,在存储之前,Rails会将CRLF转换为LF。

+1

但是CR-LF是我需要注意的唯一特殊字符,还是可能存在触发它的其他事物?此外,仍然需要Rails验证,以便在出现问题时向用户显示好的消息。 – 2010-04-08 18:27:09

+0

如果您已经将数据库和HTML设置为UTF-8编码,那么您不应该有任何其他问题。忘记漂亮的消息,因为它们永远不会显示 - 您的客户端JavaScript不会允许提交太长的数据。对于禁用JavaScript的用户有0.01%是不值得的。 – Tometzky 2010-04-08 19:37:29

+1

如果没有Rails验证,数据库会自动截断字符串,用户永远不会知道它。这是应该避免的反模式。 – 2011-04-15 15:32:11