2012-06-06 21 views
12

Pracuję w Rails 3.2 aplikacji z następującymi warunkami ułożenia:Railsy current_path Helper?

scope "(:locale)", locale: /de|en/ do 
    resources :categories, only: [:index, :show] 
    get "newest/index", as: :newest 
end 

mam kontrolera z następujących czynności:

class LocaleController < ApplicationController 
    def set 
    session[:locale_override] = params[:locale] 
    redirect_to params[:return_to] 
    end 
end 

Używam tego z czymś takim w szablony:

= link_to set_locale_path(locale: :de, return_to: current_path(locale: :de)) do 
    = image_tag 'de.png', style: 'vertical-align: middle' 
    = t('.languages.german') 

Zastanawiam się, dlaczego nie istnieje pomocnika w Rails takich jak current_path, coś, co jest w stanie wywnioskować, jaką drogą obecnie używamy, a zmiana trasy do niej obejmuje nowe opcje.

Mam problem jest użycie coś jak redirect_to :back, jeden popycha użytkownika z powrotem do /en/........ (lub /de/...), który sprawia, że ​​przyniesienie doświadczenia.

Do tej pory zapisywałem ustawienia regionalne w sesji, ale to nie zadziała dla Google i innych usług indeksowania.

Jestem pewny, że jeśli zainwestowałem wystarczająco dużo czasu, uda mi się wymyślić coś, co jest wystarczająco inteligentne, aby wykryć, która z tras jest dopasowana, i wymienić część locale, ale mam wrażenie, że to będzie hack.

Jestem otwarty na wszystkie myśli, ale ten SO question sugeruje użycie tylko sub(); niestety z tak krótkimi i często występującymi strunami, jak krótkie kody lokalne, prawdopodobnie nie jest zbyt mądry.

Odpowiedz

24

Jeśli używasz zakresu :locale, można użyć url_for jak current_path:

# Given your page is /en/category/newest with :locale set to 'en' by scope 

url_for(:locale => :en) # => /en/category/newest 
url_for(:locale => :de) # => /de/kategorie/neueste 
+3

Dobra sztuczka, skończyłem na pisaniu tego: 'def current_path (options = {}); options = request.params.symbolize_keys.merge (opcje); url_for Rails.application.routes.recognize_path (request.path) .merge (opcje) koniec 'który czuł się przesadnie! –

3

W przypadku ktoś wygląda tutaj, można użyć request.fullpath która powinna dać ci wszystko po nazwie domeny, a zatem będzie to locale .