2014-05-15 2 views
1

I 임의의 URL의 결말과사용자 레일 4 개 경로 "/"

/path/var1/var2

유일한 문제처럼 보이는 GET 경로를 생성하는 방법은 VAR2에 대한 그 생성 된 값 중 일부는 가지고있다가 그들 안에 "/". VAR 2 "h4rd/ERW"레일입니다 그래서 경우

/path/var1/h4rd/erw 또는

로 읽어

/path/var1/var2/var3

레일이 경로의 다른 매개 변수가 생각 나는 오류를 No route matches. I를 얻을 유지 "/"를 포함하지 않도록 var2에 대해 생성 된 값을 설정하거나 가능하면/path/var1/*와 같은 경로에 와일드 카드를 넣을 수도 있습니다. 무엇이 최선의 해결책이 될까요?

답변

2

당신은 route globbing를 사용할 수 있습니다

get '/path/var1/*var2', to: 'controller#action' 

이의 요청이 /path/var1/h4rd/erw에 갔다 가정 해 봅시다. 그런 다음 컨트롤러 작업에서 params[:var2]의 값은 h4rd/erw이됩니다.

+0

이 내가 –

+0

@fivedigit 덕분에 정답 생각입니다! 완벽하게 일했습니다! (나는 단지 params 앞에 ":"가 붙어야한다고 생각했기 때문에 그것을 사용하는 것에 대해 확신하지 못했습니다) – kittyminky

1

나는 항상 값이 이스케이프됩니다.

string = "my/string" 
=> "my/string" 
CGI.escape(string) 
=> "my%2Fstring" 

그래서 URL이

/path/var1/h4rd%2Ferw 

처럼 될 것입니다 그리고 설정 올바른 변수 올바른 컨트롤러로 이동합니다.

레일즈는 컨트롤러 "params"변수의 매개 변수 값을 자동으로 이스케이프 처리하지 않으므로 컨트롤러의 값을 처리 할 때 슬래시가 문자열로 돌아갑니다.

유일한 나머지 질문은 이스케이프를 수행 할 때입니다. 당신이 경로 도우미에 인수로 값을 전달하는 경우 다음 레일과 같이, 당신을 위해 자동으로 탈출해야합니다

link_to "Here", my_route_path(:foo => "bar")