ここに解決策があります:
モデルで定義した正規表現解析メソッドで getter メソッドをオーバーライドすると機能します。したがって、UI から /\d+/ のような正規表現を入力すると、"/\\d+/" にシリアル化されてデータベースに保存されます。しかし、user.regex のインスタンスを呼び出すと、match を呼び出すことができる Regexp オブジェクトに解析されます。
例:
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 %>