Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算javascript和RubyonRails中的字符串长度_Javascript_Ruby On Rails_String_Postgresql - Fatal编程技术网

计算javascript和RubyonRails中的字符串长度

计算javascript和RubyonRails中的字符串长度,javascript,ruby-on-rails,string,postgresql,Javascript,Ruby On Rails,String,Postgresql,我在一个网站上有一个文本区域,它的长度应该是有限的 我允许用户输入255个字符,并通过Rails验证强制执行该限制: validates_length_of :body, :maximum => 255 同时,我添加了一个javascript字符计数器,就像你在Twitter上看到的那样,向用户反馈他已经使用了多少字符,并在超长时禁用提交按钮,我通过如下调用在javascript中获得该长度: element.length 最后,为了加强数据完整性,在我的Postgres数据库中,我创

我在一个网站上有一个文本区域,它的长度应该是有限的

我允许用户输入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更改,使用户能够看到真实的字符数,这样,在正确处理可能具有这些奇怪行为的所有符号时,按回车键一次递增计数器2个字符。

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

但是CR-LF是我需要注意的唯一特殊字符,还是会有其他东西触发这种情况?此外,还需要Rails验证,以便在出现问题时向用户显示漂亮的消息。如果您已将数据库和HTML都设置为UTF-8编码,则不应出现任何其他问题。忘记漂亮的消息吧,因为它们永远不会被显示——客户端JavaScript不允许提交太长的数据。对于0,01%禁用JavaScript的用户来说,这是不值得的。如果没有Rails验证,数据库将静默地截断字符串,用户将永远不会知道它。这是一种应该避免的反模式。@Reed G.Law:在PostreSQL中不是这样的-它永远不会自动截断字符串。你把Postgres和MySQL搞混了,MySQL会的。