在db中存储utf8字符串,但验证和参数化transliteriated

时间:2011-04-23 21:58:56

标签: ruby-on-rails ruby ruby-on-rails-3

在我的应用中有许多路线,例如:user_login/resource/resource_name

示例:

:vlad/photo_albums/my-first-album

用户应该能够使用他们的母语命名创建专辑(在我的情况下是俄语)。但是,如果用户将他的专辑命名为“Привет,Мир!” (这是英语中的“Hello World!”),我想使用一个字符串,其中俄语字母表的所有字母都被资源链接中类似的拉丁语字母替换。例如,用户提供专辑标题“ПриветМир!”相应的链接看起来像'vlad / photo_albums / privet-mir'。

我已经采取了一切必要的方法将俄语转换为拉丁语,但现在我正在努力找到安排所有这些的最佳方法。

第一个问题是我需要通过它的标题找到专辑:

@album = @user.albums.
        where( :title => params[:album_title] ).first
    redirect_to user_albums_path(@user) unless @album

我真的想避免在我的sql语句中使用拉丁语。

第二个问题是我不想在非拉丁字符串上运行验证(我应该吗?)所以我想在验证之前对其进行拉丁化和参数化,但是如果它的拉丁化版本通过验证仍然保存原始字符串:

  validates :title, :presence => true, :length => { :within => (2..25) },
            :allow_blank => false, :uniqueness => { :scope => :user_id }

我想要实现这一点的是哈希序列化,如{:latin_version => ...,:original_version => ..}或单独的yaml文件概念。

我需要你的思考如何正确安排这个,以及最优雅的方式。还是我迂腐呢?是否可以存储/搜索/验证/显示非拉丁字符?

1 个答案:

答案 0 :(得分:1)

存储,验证和搜索非拉丁字符完全没问题。大多数提供多语​​言和国际版本应用程序的Ruby on Rails公司在应用程序和数据库层中使用UTF-8。 UTF-8可以在Ruby on Rails和所有主流浏览器中正确参数化,显示和验证,因此您不应该在那里看到任何问题。处理此问题的最佳方法是将数据库编码和/或表字符串编码设置为UTF-8,然后在application.rb中设置Ruby on Rails编码:

config.encoding = "UTF-8"

如果您使用的是MySQL或Postgres,您可能还希望在database.yml文件中明确说明数据库编码:

development:  
  adapter: mysql2  
  database: development_db  
  user: root  
  password:  
  encoding: utf8