2013-09-05 4 views
0

컨트롤러의 매개 변수를 확인하는 것이 가장 좋은 방법입니까?컨트롤러의 레일스 params 유효성 확인

Conversion failed when converting the nvarchar value 'test' to data type int. 

내가 지금 생각하고있다 : 나는 그것을 잘못된 :id PARAM을 제공하기 위해 PARAM을 조작하면

@user = User.find_by_id(params[:id]) 

는, "/ 사용자/시험"을 방문하여 말을, 나는 다음과 같은 오류를 생성 할 수 있습니다 모델에 곧바로 적용되지 않고 모델 검증을 통해 검증 될 수있는 매개 변수

+2

합니다. – usha

+1

당신은 무엇을 시도했고 당신은 무엇을 기대합니까? 어떻게 "param"을 개조 했습니까? 이것은 너무 모호합니다. 게다가 Vimsha에는 다음과 같은 점이 있습니다. 모델 유효성 검사를 사용하는 이유는 무엇입니까? – Mischa

+0

@Vimsha이 경우 모델 유효성 검사가 작동하지 않습니다. 나는 "/ users/1/edit"로 이동하는 것이 좋다고 말하고 있지만 "/ users/test/edit"로 이동하면 문자열이 "test"가 될 수 없기 때문에 오류가 발생합니다 'User.find_by_id'를하기 위해 정수로 변환됩니다. 이것은 모델 유효성 검사와는 아무런 관련이 없습니다. – MrDanA

답변

2

예 항상 매개 변수의 유효성을 검사해야합니다. 사람들은 항상 웹 브라우저의 주소 표시 줄에있는 매개 변수를 사용하거나 DOM에 저장된 매개 변수를 수정할 수 있습니다. 매개 변수가 엉망이 될 수있는 또 다른 예는 웹 페이지가 오랜 시간 동안 열려있는 경우입니다. 누군가 "/ users/3/edit"페이지를보고 한 시간 동안 열어 둔 다음 새로 고침을했다고 상상해보십시오. 그 시간에 사용자가 삭제되었을 수 있습니다. 웹 사이트가 충돌하는 것을 원하지 않습니다. 정상적으로 처리해야합니다.

데이터베이스 및 어댑터에 따라 User.find_by_id("test")을 수행해도 충돌이 발생하지 않습니다. 그러나 데이터베이스/어댑터가 문자열을 정수로 변환 할 수 없습니다. 이 특별한 경우에 할 수있는 한 가지는 루비의 .to_i 메소드를 사용하는 것입니다.

User.find_by_id(params[:id].to_i) 

params[:id] = "12" 경우, 루비는 정수 12에 그 변환하고 코드가 잘 실행됩니다. params[:id] = "test" 경우, 루비는 정수 0 해당 변환됩니다, 당신은 또한 regular expressions to test if a string is an integer을 사용할 수 있습니다 0

의 ID와 데이터베이스 레코드를해서는 안됩니다. 당신이 정상적으로 오류를 처리하고 오는 데이터를 제어 할 수

그러나 일반적으로

, 그래, 항상 매개 변수의 유효성을 확인하려고합니다. 모델 검증을 위해 무엇이다

+1

이러한 경우에는 존재하지 않는 URL로 이동하려고하기 때문에 앱이 404를 생성해야한다고 생각합니다. 나는'to_i' 접근법이 그렇게하는 좋은 방법이라고 생각한다. Asker는'find_by_id'를'find_by_id!'로 바꾸길 원할지도 모릅니다. 이것은 (프로덕션에서) "404 Not Found"페이지를 보여줄'ActiveRecord :: RecordNotFound' 예외를 생성합니다. 'find_by_id'는 예외 대신에 단순히'nil'을 반환 할 것이고 이것은 다른 예기치 않은 행동을 일으킬 것입니다. – Mischa

+0

프로그래머가 원하는 것에 따라 달라집니다. 가능한 많은 오류를 잡아 적절한 페이지로 리디렉션하고 유용한 플래시 오류 메시지를 표시하고 싶습니다. – MrDanA