資料庫保存輸入表單中的 HTML 標記,我想剝離它們以進行正確的驗證。我在 IRB 中測驗了以下方法,它似乎作業正常。但是我無法弄清楚如何使用此方法進行驗證。
這是我的模型中的代碼:
class Task < ActiveRecord::Base
validates strip_tag(:text), length: {minimum: 3}, uniqueness: true
def strip_tag(record)
record.split(/\<.*?\>/).map(&:strip).reject(&:empty?).join(' ').gsub(/\s,/,',')
end
end
我面臨的問題是正在檢查唯一性和長度是否大于 3,但是由于 HTML 標簽,例如很容易創建重復項。
洗掉標簽后的重復示例:
"<p><span style=\"color: #1d3d70; font-family: -apple-system, system-ui, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: #ffffff;\">Testing 8449</span></p>"
還有這個:
"<p>Testing 8449</p>"
洗掉 HTML 標簽后,兩者都應該具有相同的值,例如,我想防止這種重復。
uj5u.com熱心網友回復:
我認為您需要另一列,例如check_sum條紋標簽文本并驗證該列的唯一性,因此在before_validation回呼時您剝離標簽,然后計算并設定check_sum條紋標簽文本。
# migration add new column check_sum
t.string :checksum, null: false
# model
class Task < ActiveRecord::Base
attr_accessor :striped_text
before_validation :check_sum_pure_text
validates :striped_text, length: {minimum: 3}
validates_uniqueness_of :checksum
def strip_tag(record)
# ...
end
def check_sum_pure_text
self.striped_text = strip_tag(rich_text)
# NOTE about case_sensitive
# 'user' == 'User' ???
self.checksum = Digest::MD5.hexdigest(self.striped_text)
end
end
注意:您需要多列的原因checksum是關于性能,預先計算checksum列將有助于加快檢查唯一性驗證。
uj5u.com熱心網友回復:
我最終將 html 標記剝離為值。我從我想檢查的列的資料庫中獲得了一個集合,以查看它是否是唯一的并從那里剝離 html 標簽。我使用該值來查看資料庫中的集合是否包含該值。我無法弄清楚如何在資料庫查詢期間剝離標簽。
class Task < ActiveRecord::Base
validate :check_duplicates
private
def check_duplicates
strip_txt = ActionController::Base.helpers.strip_tags(text)
errors.add(
:text,
'Text already stored. Text must be unique'
) if (
Task.select('text')
.pluck(:text)
.collect{|e|ActionController::Base.helpers.strip_tags(e)}.include? strip_txt)
end
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/422146.html
標籤:
