我正在尝试在我的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
不会显示相同的页面。
我的问题是,为什么在我的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
非常感谢任何见解。
答案 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