【问题标题】:Counting string length in javascript and Ruby on Rails在 javascript 和 Ruby on Rails 中计算字符串长度
【发布时间】:2011-02-05 18:57:06
【问题描述】:

我在网站上有一个文本区域,应该限制长度。

我允许用户输入 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 个字母的行。

有些可接受的解决方案:一个 javascript 更改,使用户能够看到真实的字符数,这样点击 return 一次会使计数器增加 2 个字符,同时正确处理可能具有这些奇怪行为的所有符号。

【问题讨论】:

    标签: javascript ruby-on-rails string postgresql


    【解决方案1】:

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

    【讨论】:

    • 但是 CR-LF 是我需要注意的唯一特殊字符,还是有其他事情会触发这种情况?此外,仍然需要 Rails 验证,以便可以向用户显示有关问题的好消息。
    • 如果您将数据库和 HTML 都设置为 UTF-8 编码,那么您应该不会有任何其他问题。忘记漂亮的消息,因为它们永远不会显示 - 您的客户端 JavaScript 不允许提交太长的数据。对于 0.01% 禁用 JavaScript 的用户来说,这是不值得的。
    • 如果没有 Rails 验证,数据库将默默地截断字符串,用户永远不会知道它。这是一个应该避免的反模式。
    • @Reed G. Law:这在 PostreSQL 中是不正确的——它永远不会默默地截断字符串。您将 Postgres 与 MySQL 混淆了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    相关资源
    最近更新 更多