ruby on rails - 使用acts_as_taggable gem输入西里尔符号时的未定义转换

时间:2014-08-27 15:34:18

标签: ruby-on-rails

gem 'acts_as_taggable_on'
gem 'activeadmin'

...

ActiveAdmin.register Article do
...
    form do |f|
        f.inputs do
            f.input :tag_list 
        end
    end
end

我正在尝试输入标签词“статья”,但作为回报:

Encoding::UndefinedConversionError in Admin::ArticlesController#create
"\xD1" from ASCII-8BIT to UTF-8

到处看,但找不到合适的答案。我该怎么做才能消除这个错误?

更新 我注意到,对于title或article_body等其他输入字段,可以传递西里尔符号。所以我猜它与acts_as_taggable gem有关。

1 个答案:

答案 0 :(得分:0)

因此,act_as_taggable gem确实存在问题。 在我通过internets和rails console的研究中,我发现问题是在保存到数据库期间。转换失败,因为它将一些未知编码转换为二进制格式,而sqlite3无法将其保存到字符串列。所以我按如下方式编辑了gem文件

~/.rvm/gems/ruby-2.1.2/gems/acts_as_taggable_on-3.0.0.rc2/lib/acts_as_taggable_on/tag.rb

...
def as_8bit_ascii(string)
    if defined?(Encoding)
        string.to_s.force_encoding('UTF-8') #It was BINARY previously
    else
        string.to_s.mb_chars
    end
end

现在它有效!

<强>更新

最好不要修改源代码,而是将其应用到您的应用程序中,我想。所以,为了应用所谓的猴子补丁我做了以下。

1)在config / initializers

中创建文件tag.rb

2)从gem复制代码并剪切/粘贴它如下(通过实验和google搜索猴子补丁)

ActsAsTaggableOn::Tag.class_eval do
    class << self
    private
        def as_8bit_ascii(string)
            if defined?(Encoding)
                string.to_s.force_encoding('UTF-8') #It was BINARY previously
            else
                string.to_s.mb_chars
            end
        end
    end
end