1

form と text_field タグを使用してユーザーに正規表現を入力してもらいたいです。しかし、私が理解しているように、デフォルトでサニタイズされています。シード.rbまたはコンソールを介して正規表現をDBに直接保存すると、機能します。しかし、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 メソッドをオーバーライドすると機能します。したがって、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 %>
于 2013-09-30T21:35:00.850 に答える