2012-02-24 9 views
0

私は、次のURL構造YYYは、製品のID、製品モデルのidフィールドでRails 3で従来のparamベースURLを処理する方法は?

/product_info.php?products_id=YYY 

を使用して、レガシーPHPアプリケーションを持っています。

私は現在、このアプリケーションをRailsとSEOの目的で書き直していますが、今はこのURL構造を維持しなければなりません。

上記のURLをProductsControllerのshowアクションにどのようにルーティングする必要がありますか? Apacheのmod_rewriteを使用して/ products /:idに書き直すべきですか、それともRailsのルーターでもできますか?私はパスヘルパーを使用してproduct_path(@product)が/product_info.php?products_id=YYY(SEO用)を返すようにしたいと思っています

+0

これはあなたがたくさんのOを処理する必要がある、またはあるだけで、このようなURL構造であり、異なるもの? – Brandan

+0

これを含む2つのURL構造があります。それらは、何年もの間、検索エンジンのインデックスに登録されていたURLなので、今は別のURLに変更する余裕がありません。あとで301のリダイレクトを行って、それらのインデックスを再作成することもできますが、今はできません。 – Shohrukh

答えて

3

これは実際には予想よりも簡単です。

まず、あなたのルートを設定:

# config/routes.rb 
MyApp::Application.routes.draw do 
    match '/product_info' => 'products#show' 
end 

Railsは、通常、PHPファイルを提供しませんので、あなたが.phpのMIMEタイプのハンドラを作成する必要があります:

セットアップ
# config/initializers/mime_types.rb 
Mime::Type.register_alias 'text/html', :php 

products#show URLパラメータに基づいて製品を検索するアクション。あなたはtext/htmlphp MIMEタイプをエイリアスので、あなたは「PHP」ビューをレンダリングするために特別な何かをする必要はありません。

# app/controllers/products_controller.rb 
class ProductsController < ApplicationController 
    def show 
    @product = Product.find(params[:products_id]) 
    end 
end 

あなたがしているので、あなたは、手動でproduct_pathヘルパーメソッドを作成する必要がありますRESTfulなルートを使用していない:

# app/helpers/products_helper.rb 
module ProductsHelper 
    def product_path(product) 
    "/product_info.php?products_id=#{product.id}" 
    end 
end 

は今ちょうどあなたのビューを作成します。

# app/views/products/show.php.erb 
<%= link_to @product.name, @product %> 
+0

パーフェクト。チャームのような作品! – Shohrukh

+0

私にとってより良いものにし、phpフォーマットへのルートを制限するために、私は 'match '/ product_info' => 'products#show'、:constraints => {:format =>/php /}'をルートとして使用しました。再度、感謝します。 – Shohrukh

+0

優れた投稿をしてくれたBrandanに感謝します。将来の旅行者のために、私は、 ':via::get'を私のマッチルートの終わりに追加する必要があるか、またはRailsが文句を言う必要があることを発見しました。幸いにも、私は__not__も私の遺跡のURLを保持する必要がありましたので、私はちょうどいいコントローラの 'フラッシュ'メッセージで私の新しいURLにリダイレクトされた小さなコントローラアクションに遺跡のURLをルーティングしました。その結果、パスヘルパーメソッドは必要ありませんでした。 –

関連する問題