資料庫保存了輸入表單中的HTML標簽,我想將其剝離以進行正確的驗證。我在 IRB 中測驗了以下方法,它似乎作業得很好。但是我無法弄清楚如何使用該方法來進行驗證。
以下是我的模型中的代碼:
class Task < ActiveRecord::Base
驗證 strip_tag(:text), length: {minimum: 3}, uniqueness: true
def strip_tag(記錄)
record.split(/<.*?>/).map(&:strip).rejection(&:empty? ).join(' ').gsub(/s,/,', ')
結束。
結束。
我所面臨的問題是,我正在檢查唯一性和長度是否大于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;">測驗8449</span></p>"/span>
還有這個:
"<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
驗證: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[/span]。
# 'user' == 'User' ??
self.checksum = Digest::MD5.hexdigest(self.striped_text)
結束。
結束。
注意:之所以需要多一列checksum是關于性能的,預先計算checksum列將有助于加快檢查唯一性的驗證。
uj5u.com熱心網友回復:
我最終將html標簽剝離到了值中。我從資料庫中得到了一個我想檢查的列的集合,看它是否是唯一的,并從那里剝離了html標簽。我用這個值來查看資料庫中的集合是否包含這個值。我不知道如何在資料庫查詢程序中剝離標簽。
class Task < ActiveRecord::Base
驗證:check_duplicates。
私有
def check_duplicates
strip_txt = ActionController::Base.helpers.strip_tags(text)
errors.add(
:text,
'Text already stored. 文本必須是唯一的'。
) if (
Task.select('text')
.pluck(:text)
.收集{|e|ActionController::Base.helpers.strip_tags(e)}.include? strip_txt)
結束。
結束。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/313798.html
標籤:
