1

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

例如

http://localhost:3000/recipes/pizza

http://localhost:3000/recipes/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

任何见解将不胜感激。

4

2 回答 2

0

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

MySQL 默认使用不区分大小写的排序规则,但是如果您的本地数据库和生产数据库具有不同的默认设置并且您没有明确指定排序规则或字符集,那么您可能最终在生产中使用不同的排序规则(show create table foo可以向您显示什么排序规则表的列使用)

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

于 2012-05-30T07:56:20.710 回答
0

正如 Frederick 已经写过的,您在 Heroku 上的 PostgreSQL 是区分大小写的。

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

https://rubygems.org/gems/route_downcaser

/ 卡斯滕

于 2013-01-07T12:57:40.367 回答