这是一个解决方案:
使用您在模型上定义的正则表达式解析方法覆盖 getter 方法将起作用。所以现在如果你通过像 /\d+/ 这样的 UI 输入正则表达式,它将序列化为 "/\\d+/" 以存储在数据库中。但是,当您调用 user.regex 的实例时,它将被解析为一个 Regexp 对象,您可以在该对象上调用 match。
例子:
u = User.create(regex: "/\\d+/")
u.regex => /\d+/
u.regex.class => Regexp
u.regex.match("12345") => #<MatchData "12345">
u.regex.match("12345abc") => #<MatchData "12345">
模型:
class User < ActiveRecord::Base
def regex
parse_regex(self[:regex])
end
def parse_regex(string)
pieces = string.split("/")
pattern = pieces[1]
flags = pieces[2]
arg_two = 0
if flags.present?
flags.length.times do |i|
case flags[i, 1]
when "i"
arg_two |= Regexp::IGNORECASE
when "m"
arg_two |= Regexp::MULTILINE
when "x"
arg_two |= Regexp::EXTENDED
end
end
end
Regexp.new(pattern, arg_two)
end
end
控制器:
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(user_params).save
end
private
def user_params
params.require(:user).permit(:regex)
end
end
看法:
<%= form_for @user do |f| %>
<%= f.label :regex %>
<%= f.text_field :regex %>
<%= f.submit %>
<% end %>