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

如何在模板中校验输入?实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:42:24