Ruby on rails ActiveRecord:除非另有规定,否则在保存之前,使所有文本字段都具有strip调用
这些年来,我在各种网站上遇到了各种各样的问题,用户在字符串和文本字段的开头/结尾添加了空格。有时这些会导致格式/布局问题,有时会导致搜索问题(即搜索顺序看起来有误,尽管事实并非如此),有时会导致应用程序崩溃 我认为这将是有用的,而不是像过去那样在保存前进行一系列回调,在ActiveRecord中添加一些功能,以便在保存前自动调用任何字符串/文本字段的.strip,除非我告诉它不要,例如使用Ruby on rails ActiveRecord:除非另有规定,否则在保存之前,使所有文本字段都具有strip调用,ruby-on-rails,ruby,activerecord,trim,strip,Ruby On Rails,Ruby,Activerecord,Trim,Strip,这些年来,我在各种网站上遇到了各种各样的问题,用户在字符串和文本字段的开头/结尾添加了空格。有时这些会导致格式/布局问题,有时会导致搜索问题(即搜索顺序看起来有误,尽管事实并非如此),有时会导致应用程序崩溃 我认为这将是有用的,而不是像过去那样在保存前进行一系列回调,在ActiveRecord中添加一些功能,以便在保存前自动调用任何字符串/文本字段的.strip,除非我告诉它不要,例如使用do\u not\u strip:field\x,:字段y或类定义顶部的类似内容 在我想办法解决这个问题之前
do\u not\u strip:field\x,:字段y
或类定义顶部的类似内容
在我想办法解决这个问题之前,有没有人见过更好的解决方案?说清楚一点,我已经知道我可以做到:
before_save :strip_text_fields
def strip_text_fields
self.field_x.strip!
self.field_y.strip!
end
但我在寻找更好的方法
干杯,麦克斯。我不久前为此写了一篇文章。我已经有一段时间没试过了,而且它也没有测试——所以不能保证它仍然有效。好的方面是一个干净的模型:
class Story < ActiveRecord::Base
strip_strings :title, :abstract, :text
end
类故事
这是一个方便的模块,您可以将其放入lib并包含在模型中。它没有您提到的异常,但它会查找条带代码>方法,这可能足够好了。如果需要,您可以相当容易地添加异常功能
# lib/attribute_stripping.rb
module AttributeStripping
def self.included(context)
context.send :before_validation, :strip_whitespace_from_attributes
end
def strip_whitespace_from_attributes
attributes.each_value { |v| v.strip! if v.respond_to? :strip! }
end
end
这样使用:
class MyModel < ActiveRecord::Base
include AttributeStripping
# ...
end
module AttributeStripper
def self.before_validation(model)
model.attributes.each_value { |v| v.strip! if v.respond_to? :strip! }
true
end
end
并将其方法设置为在模型中的正确时间调用:
class MyModel < ActiveRecord::Base
before_validation AttributeStripper
# ...
end
classmymodel
这个模块更容易测试,因为它不是一个mixin。我在各种应用程序中处理过此类数据完整性问题
我过去常常这样处理输入
但现在,我实际看到并遵循的最好建议是存储用户类型的任何内容。
然后在后端进行后处理以进行剥离。
如果确实需要在数据库模型表中创建其他数据库字段(已取消剥离)
这样做的主要原因是一件(主要)事情——当用户想要重新访问他们的数据,即编辑数据时,他们通常希望看到他们输入的内容。第二个原因是,您可以避免您的条带工作不正常,或者损坏数据,或者实际抛出错误的可能性。非常感谢@Wukerplank,我已经将其纳入其中,并且它似乎完成了工作:)我想从最不奇怪的角度来看,最好在模型中明确列出我要条带的文本字段,而不是像最初那样列出我不想脱光的衣服。顺便说一句,你的插件页面上的安装链接不起作用:我认为你只需要在开始时用“git”替换“https”。还剩下一个puts,大概是为了调试?干杯maxYes,我还认为显式声明字段将使模型更具可读性。谢谢你的提示,我会把它清理干净:)你在哪里加的脱线器?我把它放在lib/modules中,但它不是loading@chrishough我已经很长时间没有更新这个插件了,甚至没有一个双子版本。看一看哪一个似乎是最新的。在此基础上,see似乎不适用于Model\update
。该属性确实会被剥离,但实际上并没有进入数据库。我不明白为什么。调用Model#save
似乎效果不错。