You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rails视图中使用Decorator重构敏感信息掩码代码?

如何用Decorator重构Rails视图中的掩码逻辑

我来帮你一步步梳理怎么用Decorator把视图里的硬编码掩码逻辑抽离出来,让代码更整洁易维护。

1. 先修正你的DriverApplicantDecorator

你当前的装饰器代码依赖外部的form和dot_application,这违背了Decorator封装模型自身展示逻辑的原则。我们调整一下,让它只聚焦于DriverApplicant模型的属性处理:

# app/decorators/driver_applicant_decorator.rb
class DriverApplicantDecorator < Draper::Decorator
  delegate_all # 继承原模型的所有方法

  # 专门处理SSN掩码的方法
  def masked_ssn
    return '' unless ssn.present? # 处理空值情况
    "*******#{ssn.last(4)}"
  end

  # 专门处理出生日期掩码的方法
  def masked_dob
    return '' unless date_of_birth.present?
    # 假设date_of_birth是Date对象,转成字符串后取年份部分(最后4位)
    "*******#{date_of_birth.strftime('%Y')}"
  end

  # 可选:通用掩码方法,根据字段名返回对应结果
  def masked_field(field_name)
    case field_name.to_sym
    when :ssn then masked_ssn
    when :dob then masked_dob
    else '' # 未知字段返回空,也可根据需求抛出提示
    end
  end
end

注:这里假设你用的是Rails生态中最常用的Draper装饰器gem,如果还没安装,先把gem 'draper'加到Gemfile,然后运行bundle install。

2. 在控制器中装饰模型实例

确保在渲染视图前,把driver_applicant实例用装饰器包装起来。比如在对应的控制器动作里:

# 示例:DotApplicationsController的personal_information动作
def personal_information
  @dot_application = DotApplication.find(params[:id])
  # 对关联的driver_applicant应用装饰器
  @driver_applicant = @dot_application.driver_applicant.decorate
end

如果你的form是自定义Form对象,也可以在Form类里直接调用模型的装饰器方法,或者给Form本身写装饰器,保持逻辑统一。

3. 修改视图代码,调用装饰器方法

现在你可以把视图里的硬编码替换成装饰器提供的方法了:

td.word-break.hidden-value = @driver_applicant.masked_ssn
td.word-break
  button.show-hidden-info data-field-type="ssn" data-link="#{company_dot_application_show_hidden_informations_path(@dot_application)}"
    | Show SSN

如果用通用的masked_field方法,写法也很灵活:

td.word-break.hidden-value = @driver_applicant.masked_field(:ssn)

为啥要这么改?

Decorator的核心作用就是把视图层的展示逻辑从视图文件中抽离,以后如果掩码规则需要调整(比如改成***-**-1234格式),只需要修改Decorator里的方法,不用去改所有用到这个逻辑的视图,代码复用性和可维护性都会提升很多。

内容的提问来源于stack exchange,提问作者user9703984

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:41:52