簡體   English   中英

在Rails中路由時區分大小寫的ID

[英]Case-sensitive ids when routing in Rails

我正在嘗試在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

將不會顯示同一頁面。

我的問題是,為什么在我的本地主機服務器上忽略大小寫。 而且,是否可以在在線實施中解決此問題?

這是一些有關我目前如何實現個性網址的相關代碼。

#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默認情況下使用不區分大小寫的排序規則,但是,如果您的本地數據庫和生產數據庫具有不同的默認設置,而您未明確指定排序規則或字符集,則可能會在生產中使用不同的排序規則( show create table foo can向您展示表的列使用什么排序規則)

如果您在heroku上運行,那么除非您已花錢購買提供mysql db的插件,否則您將使用postgres,而postgres將默認進行區分大小寫的比較。 順便說一下,Heroku不會做任何“翻譯”,只是activerecord知道如何處理postgres。 不可避免地會忽略數據庫之間有時細微的差異,因此強烈建議您在本地使用與將要部署到的數據庫相同的數據庫。

正如Frederick所寫,Heroku上的PostgreSQL區分大小寫。

我建議您確保數據庫中所有可搜索的關鍵字均為小寫(例如:pizza和NOT Pizza)。 然后,您可以使用此小工具自動將URL的路由部分變為小寫:

https://rubygems.org/gems/route_downcaser

/卡斯滕

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM