如何在模板中校验输入?实现key为'foo'时禁止修改
实现key为'foo'时禁止修改的输入校验方案
一、前端视图层修正(界面级限制)
你提供的Haml代码存在逻辑错误:当前判断的是符号:key等于字符串'foo',这永远不会成立,得获取表单绑定对象的实际key值来做判断。修正后的代码如下:
.email-template-param-nested-fields - if f.object.key == 'foo' = f.input :key, placeholder: 'foo', readonly: true, input_html: { value: 'foo' } - else = f.input :key, placeholder: 'key' = f.input :value, placeholder: 'example'
这里加了两个关键调整:
- 用
f.object.key拿到当前嵌套字段对应对象的key值,判断是否为'foo' - 给readonly状态的输入框固定value为'foo',避免用户通过浏览器修改DOM值提交
二、后端安全校验(必须做)
前端的readonly只是界面限制,懂点技术的用户能通过调试工具改请求参数绕过,所以必须在后端加校验逻辑,从根源上阻止修改。
模型层验证(推荐)
假设你的模型是EmailTemplateParam,在模型里加自定义验证:
class EmailTemplateParam < ApplicationRecord validate :block_foo_key_modification private def block_foo_key_modification # 仅针对更新操作:如果原记录key是'foo',禁止修改key字段 if persisted? && original_key = self.class.find(id).key if original_key == 'foo' && key_changed? errors.add(:key, "无法修改'foo'这个key") end end # 可选:如果要禁止新增key为'foo'的记录,打开下面注释 # if new_record? && key == 'foo' # errors.add(:key, "不允许使用'foo'作为key") # end end end
控制器层拦截(可选补充)
也可以在控制器的update方法里直接拦截非法请求:
def update @param = EmailTemplateParam.find(params[:id]) if @param.key == 'foo' && params[:email_template_param][:key] != 'foo' flash[:alert] = "不能修改'foo'这个key" redirect_to edit_email_template_param_path(@param) return end if @param.update(param_params) # 成功跳转逻辑 else render :edit end end
内容的提问来源于stack exchange,提问作者kek5
相关产品推荐
相关产品推荐

