Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.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
Ruby on rails ActiveRecord:除非另有规定,否则在保存之前,使所有文本字段都具有strip调用_Ruby On Rails_Ruby_Activerecord_Trim_Strip - Fatal编程技术网

Ruby on rails 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或类定义顶部的类似内容 在我想办法解决这个问题之前

这些年来,我在各种网站上遇到了各种各样的问题,用户在字符串和文本字段的开头/结尾添加了空格。有时这些会导致格式/布局问题,有时会导致搜索问题(即搜索顺序看起来有误,尽管事实并非如此),有时会导致应用程序崩溃

我认为这将是有用的,而不是像过去那样在保存前进行一系列回调,在ActiveRecord中添加一些功能,以便在保存前自动调用任何字符串/文本字段的.strip,除非我告诉它不要,例如使用
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
似乎效果不错。