在Rails中路由时区分大小写的ID

时间:2012-05-29 20:29:16

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

我正在尝试在我的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

不会显示相同的页面。

我的问题是,为什么在我的localhost服务器上忽略大小写。而且,在线实施是否有优雅的问题来处理这个问题?

以下是我目前如何实施虚荣网址的相关代码。

#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

非常感谢任何见解。

2 个答案:

答案 0 :(得分:0)

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

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

如果你在heroku上运行,那么除非你已经不费力地为一个提供mysql数据库的add-inn付费,否则你将使用postgres和postgres默认进行区分大小写的比较。 Heroku不会做任何“翻译”,只是主动记录知道如何处理postgres。没有逃避数据库之间有时微妙的差异,因此强烈建议您在本地使用与要部署到的数据库相同的数据库。

答案 1 :(得分:0)

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

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

https://rubygems.org/gems/route_downcaser

/ Carsten