2011-12-02 3 views
1

개별 항목을 관리하기위한 레일스 앱을 만들고 있습니다. 각 항목에는 응용 프로그램의 URL에 사용할 항목 번호 (0으로 채워진 숫자, 4 자리 숫자, 예 : 0002 또는 0212 또는 1002)가 있습니다. 현재 /items/2으로 이동하는 경우 id = 2으로 항목을 가져오고 item_number = 2으로 항목을 가져 오지 않습니다. 내 routes.rb 파일에는 resources :items 만 포함되어 있습니다. 이 항목 번호로 항목을 끌어낼 수 있도록 내가 어떻게 갈 것입니까?레일즈 URL에 맞춤 식별자 (ID 아님)

답변

7
는 항목 모델의 to_param 메서드를 재정의

: 당신은 당신의 경로에서 아무것도 변경하지 않아도

def to_param 
    item_number.to_s 
end 

. 당신은 그냥 그냥 알다시피 find_by_item_number(params[:id])


사용하여 항목을 찾을해야합니다 :

def to_param 
    "#{id}-#{name}".parameterize 
end 
: 당신이 URL에 항목의 이름을 표시하고 싶다면, 다음을 수행 할 수

위대한 점은 "1-item-name".to_i가 1입니다! 따라서 어디서나 찾기 방법을 변경하지 않아도됩니다.

item = Item.find(1) 
item_path(item) # => "/items/1", i.e. the same result as calling item_path(item.id) 

그것은 항목에 to_param 인스턴스 메서드를 호출하여이 "마법"을 수행합니다

+0

당신은 내가 하려던 말 그대로 무엇을 썼다. 좋은 답변 :) – Andrew

+0

나는 또한 find_by_param'라는 동급 클래스 메서드를 만들 것을 권합니다. – phoet

+0

감사합니다. Robin, 방금 to_param을 반환하여 번호를 업데이트하고 아이템 컨트롤러를 업데이트했습니다. @item = Item.find_by_number (params [: id]), 1023에 호출 된 private 메소드'split '의 NoMethodError를 얻고 있습니다 :/items/1023 – Jack

2

일반적으로는 item_path 도우미 (당신이 resources :items을 정의하여 무료로 얻을) URL을 구성하는 항목의 ID를 사용 클래스는 기본적으로 항목의 id를 반환합니다.

그래서 다른 것을 원하면 to_param 메서드를 재정의해야합니다. 귀하의 경우에는, 당신이 뭔가를 할 수 있습니다 : 다음

class Item < ActiveRecord::Base 
    def to_param 
    item_number 
    end 
end 

과 :

item = Item.find_by_item_id('0001') 
item_path(item) # => "https://stackoverflow.com/users/0001" 
관련 문제