2011-04-27 1 views
2

레일스 - 생성 된 URL을 친숙한 URL로 수정하는 방법

처럼 보이는 모델이 있습니다.
search.rb: 
    id eg: 101 
    name eg: San Francisco 

cars.rb 
    id 
    name 

검색 컨트롤러가 사용자를 자동차로 리디렉션합니다.

search_controller.rb 
if search.search_type=='cars' 
    redirect_to :controller=>'cars', :action=>'index', :id=>search 
end 

샌프란시스코에서 자동차 목록을 찾는 쿼리는 다음과 같습니다.

http://localhost/cars?id=101 

search.rb의 to_param 메소드를 다음과 같이 덮어 씁니다.

search.rb 
def to_param 
    normalized_name = name.gsub(' ', '-').gsub(/[^a-zA-Z0-9\_\-\.]/, '') 
    "#{self.id}-#{normalized_name}" 
end 

어느 정도까지 작동합니다. 다음과 같은 URL을 생성합니다.

http://localhost/cars?id=101-San-Francisco 

그러나

http://localhost/cars/San-Francisco 

처럼 보이는 URL을 생성하고 싶습니다. 경로를 수정합니까?

귀하의 도움에 감사드립니다.

답변

2

준비가되지 않은 경우 힘들 수 있습니다. 모델을 params에 표시하는 방법을 제어하는 ​​방법은 사용자가 확인한 것처럼 매우 간단하지만 그 중 절반에 불과합니다. 나중에 당신은 그것을 검색해야합니다, 그래서 당신은 그것을 위해 설정해야합니다

class Search < ActiveRecord::Base 
    before_save :assign_slug 

    def self.from_param(id) 
    self.find_by_slug(id) 
    end 

    def to_param 
    self.slug 
    end 

protected 
    def assign_slug 
    self.slug = self.name.gsub(' ', '-').gsub(/[^\w\-\.]/, '') 
    end 
end 

이 가능 그것에 의해 검색을 찾아 볼 수 있도록하기 위해 사용자의 검색 모델에 slug 열을 추가해야합니다. 효율적인 방법으로 나중에 색인을 검색하는 데 도움이되는 고유 한 색인을 추가하는 것이 좋습니다.

컨트롤러에서 검색하는 대신 find을 사용하지 않고 from_param을 사용하지 마십시오.

또한이 매개 변수를 사용자 정의 경로를 추가해야합니다 : 여러 경로가 동일한 매개 변수와 일치 할 수 있기 때문에 가능하면 라우팅 경로 생성 방법을 사용한다 참고로

match '/cars/:search', :to => 'cars#index', :as => 'cars_search' 

합니다. 예 :

redirect_to cars_search_path(:search => search)