如何在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
相关产品推荐
相关产品推荐

