【问题标题】:Case-sensitive ids when routing in Rails在 Rails 中路由时区分大小写的 id
【发布时间】:2012-06-04 02:19:09
【问题描述】:

我正在尝试在我的 Rails 应用程序中实现一个虚 URL 系统。在 localhost:3000 服务器上,实现运行良好。我有一个系统,可以通过其名称请求配方,但如果通过 ID 请求,也可以回退到默认行为。无论名称实际保存为什么,此实现对于小写和大写名称都适用。

例如

http://localhost:3000/recipes/pizza

http://localhost:3000/recipes/Pizza

即使记录保存为“Pizza”,也会指向同一页面。

在哪里:

http://www.test-server.com/recipes/pizza

http://www.test-server.com/recipes/Pizza

不会显示相同的页面。

我的问题是,为什么我的本地主机服务器上忽略了大写。而且,在线实施是否可以优雅地解决这个问题?

这是我目前如何实现虚 URL 的一些相关代码。

#models/recipe.rb  
 def to_param
    name.parameterize
  end


# relevant code from routes.rb
  match '/recipes/:name' => 'recipes#show'

# relevant code from controllers/recipe_controller.rb
  def show
    name = params[:id].gsub("-", "\s")
    @recipe = Recipe.find_by_name(name)
    @recipe = Recipe.find(params[:id]) if @recipe.nil?
    puts @recipe.ingredients.inspect
    puts @recipe.amounts.inspect
    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @recipe }
    end
 end

任何见解将不胜感激。

【问题讨论】:

  • 你在每台机器上运行什么数据库服务器?
  • 两台机器都在运行 MySQL。测试主机托管在 Heroku 上,我知道他们可能正在将 MySQL 转换为 PostreSQL。
  • 那是你的问题。 PostgreSQL 区分大小写。在下面的答案中查看我的解决方案。

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


【解决方案1】:

如何比较字符串取决于用于列的排序规则(如有必要,可以在每个表或每个列级别上设置)。

默认情况下,MySQL 使用 case insensitive 排序规则,但是如果您的本地数据库和生产数据库具有不同的默认设置,并且您没有明确指定排序规则或字符集,那么您最终可能会在生产环境中使用不同的排序规则 (@ 987654322@ 可以告诉你一个表的列使用什么排序规则)

如果您在 heroku 上运行,那么除非您已竭尽全力购买提供 mysql 数据库的插件,否则您将使用 postgres,而 postgres 将默认进行区分大小写的比较。顺便说一下,Heroku 不做任何“翻译”,只是 activerecord 知道如何处理 postgres。数据库之间有时存在细微的差异是不可避免的,因此强烈建议您在本地使用与将要部署到的数据库相同的数据库。

【讨论】:

    【解决方案2】:

    正如 Frederick 已经写的那样,Heroku 上的 PostgreSQL 区分大小写。

    我建议您确保数据库中所有可搜索的关键字都是小写的(例如:pizza 和 NOT Pizza)。然后你使用这个小 gem 自动将你的 URL 的路由部分变成小写:

    https://rubygems.org/gems/route_downcaser

    /卡斯滕

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 2016-11-24
      • 2014-03-10
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 2019-12-20
      相关资源
      最近更新 更多