2012-04-07 2 views
3

나는이 질문을 더 일찍 요구했고 그것이 고쳐 졌다고 생각했다. 그러나 그것은 아니다. 이전 질문 here 내 문제는 내가 경로를 설정하기 위해 노력하고있다경로가 일치하지 않고 레일 앱이 예기치 않게 리디렉션되는 이유는 무엇입니까?

그래서 내가

에 입력 할 때

로컬 호스트 : 3000/사이트

그것은

로컬 호스트로 리디렉션해야/관리자 : 3000/EN/사이트/관리

여기 내 routes.rb 파일입니다

scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do 
    get "log_out" => "sessions#destroy", as: "log_out" 
    get "log_in" => "sessions#new", as: "log_in" 

    resources :sites, except: [:new, :edit, :index, :show, :update, :destroy, :create] do 
    collection do 
    get :home 
    get :about_us 
    get :faq 
    get :discounts 
    get :services 
    get :contact_us 
    get :admin 
    get :posts 
    end 
end 
resources :users 
resources :abouts 
resources :sessions 
resources :coupons 
resources :monthly_posts 
resources :reviews 
resources :categories do 
collection { post :sort } 
resources :children, :controller => :categories, :only => [:index, :new, :create, :new_subcategory] 
end 
resources :products do 
    member do 
    put :move_up 
    put :move_down 
    end 
end 
resources :faqs do 
    collection { post :sort } 
end 
root :to => 'sites#home' 
match "/savesort" => 'sites#savesort' 

end 

match '', to: redirect("/#{I18n.default_locale}") 
match '*path', to: redirect("/#{I18n.default_locale}/%{path}") 

지금 당장은/en/en/en/ko/ko/ko/ko/ko/sites/admin으로 리디렉션됩니다 (브라우저가 불평 할 때까지 추가).

덧셈을 계속하는 이유는 무엇입니까?

편집 : 답은 정말 감사합니다. 루트 루트를 진단하도록 도와 줄 수 있습니까?

root to: redirect("#{/#{I18n.default_locale}") # handles/

내가

redirect("www.example.com") 

같은 뭔가를 찾고있다 리디렉션을 알고는 그래서이 부분

#{/#{I18n.default_locale} 

# {오른쪽 rubys 문자열 보간을 사용을 남긴다? 나는 그것이 무엇을하고 있는지 확실하지 않다.

그래서 우리는 또한 문자열 보간을 사용하고 I18n.default_locale의 값을 출력하는

/#{I18n.default_locale} 

있나요?

희망적으로, 나는 도움을 정말로 정말로 바란다. 나는 많이 배우고있다.

편집 2 :

나는

root to: redirect("/#{I18n.default_locale}") # handles/

root to: redirect("#{/#{I18n.default_locale}") # handles/

에서 라인을 변경하지만 난 그게 잘 있는지 확실하지 않습니다. 지금은 오류

uninitialized constant LocaleController 

내가가 루트에서 오류가 발생 것을 알고 얻고있다 "로케일 # 루트를",하지만 난 로케일 번호가 범위에서 올 거라 생각 했어요.

나는 계속해서 게임을하고 진행 상황을 알려줄 것입니다.내 경로가 https://gist.github.com/2332198

답변

10

파일에

여기서 우리는 다시 ruevaughn을 충족 새로운 링크입니다. :)

나는 테스트 레일 응용 프로그램을 만들어 다음과 같은 최소한의 예는 나를 위해 작동 :

scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do 
    resources :sites do 
    collection do 
     get :admin 
    end 
    end 

    root to: "locale#root" # handles /en/ 
    match "*path", to: "locale#not_found" # handles /en/fake/path/whatever 
end 

root to: redirect("/#{I18n.default_locale}") # handles/
match '*path', to: redirect("/#{I18n.default_locale}/%{path}") # handles /not-a-locale/anything 
+0

좋은 답변과 노력, +1 – apneadiving

+1

그리고 우리가 다시 만난 것을 기쁘게 생각합니다 :) 대답은 내가 기대할 수있는 것 이상입니다. 나는 당신이 루트를 가질 수 있다는 것을 몰랐다 : 당신의 스코프와 그것의 바깥쪽에, 나는 로케일 # 루트를 그런 식으로 호출 할 수 있다는 것을 모르고 있었다. 나는 아직도 배우고있다. 루트 : 리다이렉트 나는 꽤 확신 할 수 없으므로 시간이 있다면 질문에 편집을 게시했다. 감사합니다. 다시 – ruevaughn

+0

'locale # root'는'controller # action'의 약식이므로 LocaleController의'root' 메소드가 될 것입니다. 나는 그것을 단지 자리 표시 자로 사용했다. 앱에서 의미가있는 것으로 바꾸면됩니다. –

0

레일을 4.0.x의를 사용하는 경우 당신이 얻을 것이다, 그래서 경로에 슬래시를 이스케이프합니다 리디렉션에 그 %{path} 나처럼, 이런 경우 누군가에 /en/en%2Fen%2Fen%2Fen...

로 리디렉션 무한 루프가, 레일-4에 적합한 솔루션을 찾고있다, 이것은 내가 리디렉션 훨씬 더 복잡한 경로를 문제없이 작동하는 찾을 것입니다 :

# Redirect root to /:locale if needed 
root to: redirect("/#{I18n.locale}", status: 301) 

# Match missing locale paths to /:locale/path 
# handling additional formats and/or get params 
match '*path', to: (redirect(status: 307) do |params,request| 
    sub_params = request.params.except :path 
    if sub_params.size > 0 
    format = sub_params[:format] 
    sub_params.except! :format 
    if format.present? 
     "/#{I18n.locale}/#{params[:path]}.#{format}?#{sub_params.to_query}" 
    else 
     "/#{I18n.locale}/#{params[:path]}?#{sub_params.to_query}" 
    end 
    else 
    "/#{I18n.locale}/#{params[:path]}" 
    end 
end), via: :all 

# Redirect to custom root if all previous matches fail 
match '', to: redirect("/#{I18n.locale}", status: 301), via: :all 
+0

이전 코드를 교체 한 후에도 여전히 문제가 발생합니다. 조언 해주십시오 – Sai

+0

프로덕션 환경에서 현재 사용중인 코드로 답변을 업데이트했습니다. 지금까지 약 1 년 동안 문제가 없었습니다. 이 기능이 나에게 도움이 될지 알려주세요 @ 사이! – marzapower

+1

고마워, 그게 효과가 있었다. 나는 또한 이것으로 인해 발생했다고 생각한 자산 사전 컴파일과 관련된 문제를 겪고있었습니다. – Sai

관련 문제