2013-09-30 83 views
1

我想用戶使用form和text_field標記輸入正則表達式。但據我瞭解,它正在被默認消毒。如果我通過seed.rb或控制檯直接在數據庫中存儲正則表達式,它就可以工作。但我不能使用用戶界面:如何讓ruby在rails的text_field上接受regex?

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

如何解決它?

回答

0

這裏是一個解決方案:

覆蓋使用您定義的模型將工作正則表達式解析方法getter方法。所以,現在如果你通過像/ \ d + /這樣的UI輸入正則表達式,它將會序列化爲「/ \\ d + /」以存儲在數據庫中。但是,當你調用user.regex的實例時,它將被解析成一個可以調用匹配的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 %> 
+0

那麼,它可能是我的下一個問題。但目前我在控制器級別遇到問題。當我的視圖發送更新請求時,它假定text_field內容是一個字符串,這意味着它會取出所有「危險」符號,如反斜槓,引號等,並將/ \ d + \「/更改爲」\\ d + \\\ 「」。所以我想知道如何解決它? –

+1

@MikhailChuprynski我已經編輯了我的答案,希望您的滿意。 – mpiccolo