1

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

どんな洞察も大歓迎です。

4

2 に答える 2

0

Frederick が既に書いたように、Heroku 上の PostgreSQL では大文字と小文字が区別されます。

DB 内のすべての検索可能なキーワードが小文字であることを確認することをお勧めします (例: ピザとピザではありません)。次に、この小さな gem を使用して、URL のルーティング部分を自動的に小文字にします。

https://rubygems.org/gems/route_downcaser

/ カルステン

于 2013-01-07T12:57:40.367 に答える
0

文字列の比較方法は、列に使用される照合 (必要に応じて、テーブルごとまたは列レベルごとに設定できます) に依存します。

MySQL はデフォルトで大文字と小文字を区別しない照合を使用しますが、ローカル データベースと本番データベースのデフォルト設定が異なっていて、照合または文字セットを明示的に指定しなかった場合、本番では異なる照合になる可能性がありshow create table fooます (どの照合を表示することができます)テーブルの列の使用)

heroku で実行している場合、mysql データベースを提供するアドインにわざわざお金を払っていない限り、postgres を使用し、postgres はデフォルトで大文字と小文字を区別して比較します。ところで、Heroku は「変換」を行いません。activerecord が postgres の処理方法を知っているだけです。データベース間の微妙な違いを回避することはできないため、展開先のデータベースと同じデータベースをローカルで使用することを強くお勧めします。

于 2012-05-30T07:56:20.710 に答える