1

我希望用户使用表单和 text_field 标签输入正则表达式。但据我了解,默认情况下会对其进行消毒。如果我通过 seed.rb 或控制台将正则表达式直接存储在数据库中,它就可以工作。但我不能使用 UI 来做到这一点:

<div class="control-group">
  <%= f.label :regexp, :class => 'control-label' %>
  <div class="controls">
    <%= f.text_field :regexp, :class => 'text_field' %>
  </div>
</div>

如何解决?

4

1 回答 1

0

这是一个解决方案:

使用您在模型上定义的正则表达式解析方法覆盖 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 %>
于 2013-09-30T21:35:00.850 回答