2012-02-24 75 views
0

我有一個使用下列URL結構如何在Rails 3中處理傳統的參數庫URL?

/product_info.php?products_id=YYY 

其中YYY是產品的標識,產品型號的ID字段的遺留PHP應用程序。

我現在正在使用Rails重寫這個應用程序,並且爲了SEO的目的,我現在必須保留這個URL結構。

我應該如何將上述URL路由到我的ProductsController的show action?我應該使用Apache的mod_rewrite將其重寫到/ products /:id,還是可以使用Rails的路由器來完成?我希望能夠使用路徑幫助程序,以便product_path(@product)返回我/product_info.php?products_id=YYY(再次用於SEO)

+0

這是你需要處理,還是有很多○只有這樣的URL結構f不同的? – Brandan 2012-02-25 00:57:29

+0

有兩個這樣的URL結構,包括這個。這些是已經在搜索引擎索引多年的URL,我們現在不能將它們改變爲其他的東西。也許以後我們可以做301重定向重新索引它們,但不是現在。 – Shohrukh 2012-02-25 10:13:32

回答

3

這實際上比我預期的更直接。

首先,設置您的路線:

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

因爲Rails不正常服務PHP文件,你需要創建一個MIME類型處理程序.php

# config/initializers/mime_types.rb 
Mime::Type.register_alias 'text/html', :php 

設置您的products#show操作根據URL參數查找產品。既然你使用了別名php MIME類型text/html,你沒有做什麼特別呈現「PHP」的觀點:

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

您必須手動創建product_path helper方法,因爲你不使用REST風格的路線:

# 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 2012-02-27 01:31:18

+0

爲了讓它更好,並且限制只有php格式的路由,我使用'match'/ product_info'=>'products#show',:constraints => {:format =>/php /}'作爲路由。再次感謝。 – Shohrukh 2012-02-27 01:36:59

+0

非常感謝Brandan的優秀貼文,你現在可能會在哪裏。對於未來的旅行者,我發現我需要添加',via::get'到我的比賽路線的末尾,否則Rails會抱怨。幸運的是,我也沒有__not__需要保留我的遺留網址,所以我只是將遺留網址路由到一個小控制器操作,該操作通過一個很好的'flash'消息重定向到我的新網址。因此,我也不需要路徑幫助器方法。 – 2015-05-07 22:14:24