Rails向导表单按URL参数tab值实现部分字段验证失效求助
问题原因
Rails 遵循 MVC 分层职责,params 是控制器层专属的对象,模型层的上下文里默认不存在 params 变量,所以你写的判断条件永远返回 false,验证自然不会触发。
解决方法
步骤1:给模型加存储tab值的临时属性
在Web模型里新增可读写的临时属性,用来接收控制器传过来的tab值,不需要存入数据库:
class Web < ApplicationRecord attr_accessor :current_tab validate :validate_website, if: -> { current_tab == 'address' } # 封装成方法的写法也通用:validate :validate_website, if: :tab_address private # def tab_address # current_tab == "address" # end def validate_website regexp = %r{\A(http://www\.|https://www\.|http://|https://)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(/.*)?\z} if website.present? && !website.match(regexp) errors.add :website, "Error" end end end
步骤2:控制器层给属性赋值
在你实例化/更新Web对象的控制器方法里,把params[:tab]赋值给模型的current_tab属性:
# 写法1:单独赋值,不需要改强参数 @web = Web.new(web_params) @web.current_tab = params[:tab] # 写法2:合并到参数中赋值,需要同步修改强参数 @web = Web.new(web_params.merge(current_tab: params[:tab]))
步骤3:配置强参数(仅针对写法2需要)
如果用合并参数的写法,需要在控制器的强参数方法里把current_tab加入允许列表:
def web_params params.require(:web).permit(:website, # 其他原有允许字段 :current_tab) end
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

