2013-10-17 2 views
0

레일에 새로운이 문제에 접근하는 가장 좋은 방법이 궁금합니다.레일을 연결하는 문제 데이터베이스

내가보기에 인덱스 목록 및 결과 페이지가 :

내 경로 파일이 있습니다

resources :pages do 
collection do 
    get :list 
    get :result 
end 
end 

내가 MySQL 데이터베이스 ID로라는 결과를, 올해 (2000 -> 2013) 상품명.

내 컨트롤러가 있습니다

def index 
@years = Result.group('year').order('year DESC') 
end 

내 인덱스보기가 : 2000 년을 나열

<table class="table"> 
<% @years.each do |year| %> 
<tr><td> 
<%= link_to year.year, list_pages_path %> 
</td></tr> 
<% end %> 
</table> 

-> 2013 벌금과 내가 그것을 할 꿔하는 링크입니다 목록보기 및 이전 link_to 색인 (예 : 2013 년 모든 제품을 데이터베이스에서 나열하는 2013)에서 선택한 제품 및 연도를 나열한 다음 더 많은 제품 정보를 보여주는 결과보기에 연결합니다.

건배

당신은 년을 기준으로 필터링 할 페이지 모델의 범위를 구현할 수

답변

0

: 한 해에 대한 쿼리 매개 변수를 보낼

class Pages < ActiveRecord::Base 
    scope :year, ->(year) { where(year: year) } 
end 

는 그 다음 link_to을 변경

link_to year.year, list_pages_path(year: year.year) 

마지막으로 컨트롤러에서

def list 
    @pages = Page.year(params[:year]) 
end 

올바른 조치를 취했는지 확인해야합니다. 기본값은 PagesController#year 일 것입니다.

또한 철저히하기 위해 SQL 주입을 방지하기 위해 입력을 확인해야 할 것입니다. 아마도 같은 : params[:year]가 정수로 변환 할 수없는 경우

def list 
    @pages = Page.year(Integer(params[:year]) 
end 

이 예외가 발생합니다. 사용자가 어디에서나 매개 변수를 입력 할 수 있도록 허용하지 않으므로 악의적으로 URL을 변경하려고 시도하는 경우에만 예외가 표시됩니다. 그래도 더 우아하게 처리하고 싶을 수 있습니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 귀하의 솔루션은 대우를 받았습니다. 많은 감사합니다! – Grinskull

관련 문제