문제

내 경로가 선택적 접두사 매개 변수를 다음과 같이 인식하도록하려면 어떻게해야합니까?

/*lang/controller/id

Lang 부품은 선택 사항이며 URL에 지정되지 않은 경우 기본값이 있습니다.

/en/posts/1   => lang = en
/fr/posts/1   => lang = fr
/posts/1      => lang = en

편집하다

이상적으로는 네임 스페이스를 매핑하여 많은 컨트롤러와 작업 에서이 작업을 수행하려고합니다.

map.namespace "*lang" do |lang|
  lang.resources :posts
  lang.resources :stories
end
도움이 되었습니까?

해결책

좋아, 나는이 문제를 해결했다.

기본적으로 레일 에서이 작업을 수행하는 방법은 없습니다 (적어도 아직은 아님). 네임 스페이스와 기본값을 사용하는 대신 설치해야했습니다. Sven Fuchs의 라우팅 필터.

플러그인이 설치되면 다음 파일을 LIB 디렉토리에 추가했습니다.

require 'routing_filter/base'

module RoutingFilter
  class Locale < Base

    # remove the locale from the beginning of the path, pass the path
    # to the given block and set it to the resulting params hash
    def around_recognize(path, env, &block)
      locale = nil
      path.sub! %r(^/([a-zA-Z]{2})(?=/|$)) do locale = $1; '' end
      returning yield do |params|
        params[:locale] = locale || 'en'
      end
    end

    def around_generate(*args, &block)
      locale = args.extract_options!.delete(:locale) || 'en'
      returning yield do |result|
        if locale != 'en'
          result.sub!(%r(^(http.?://[^/]*)?(.*))){ "#{$1}/#{locale}#{$2}" }
        end 
      end
    end

  end
end

이 라인을 lours.rb에 추가했습니다.

map.filter 'locale'

이것은 기본적으로 플러그인에 의해 생성 된 후크 전후의 후크를 작성하여 레일 라우팅을 감습니다.

URL이 인식되고 Rails가 그와 관련된 작업을 수행하기 전에 Arcid_Recognize 메소드가 호출됩니다. 이것은 로케일을 나타내는 2 글자 코드를 추출하고 매개 변수로 통과하여 로케일이 지정되지 않은 경우 'en'으로 기본적으로 전달됩니다.

마찬가지로 URL이 생성되면 로케일 매개 변수가 왼쪽의 URL로 푸시됩니다.

이것은 다음과 같은 URL과 매핑을 제공합니다.

/   => :locale => 'en'
/en => :locale => 'en'
/fr => :locale => 'fr'

기존의 모든 URL 도우미는 이전과 같이 작동하며, 유일한 차이점은 로케일이 지정되지 않으면 보존됩니다.

home_path                  => /
home_path(:locale => 'en') => /
home_path(:locale => 'fr') => /fr

다른 팁

당신은 그것을 사용하여 경로에서 기본값을 정의 할 수 있습니다 :defaults 열쇠. 이 시도:

map.connect ':lang/posts/:id', :controller => 'posts', :action => 'show',
                               :defaults => { :lang => 'en' }

나는이 오래된 질문을 이해하지만 유용 할 수 있습니다.

  map.with_options(:path_prefix => ":locale") do |m|
    m.resources :posts
    m.resources :stories        
  end

그리고 로케일을 정의하기 위해 필터 전에 애플리케이션 컨트롤러에 추가해야합니다.

before_filter :define_locale

def define_locale
  if params[:locale] == nil
    I18n.locale = 'en'
  else
    I18n.locale = params[:locale]
  end
end

나는 이것이 효과가 있다고 생각합니다.

map.connect ':language/posts/:id', :controller => 'posts', :action => 'show'
map.connect 'posts/:id', :controller => 'posts', :action => 'show'

좋아, 시도해 보았습니다 - 그것은 레일 2.1.1에서 적어도 작동합니다. 그래서 좋습니다. 그러나 불이행 아이디어는 작동하는 아이디어를 얻을 수 없습니다. 건조기이기 때문에 부끄러운 일입니다.

한 번에 [key] => nil을 사용하여 선택적 매개 변수를 지정할 수 있다고 생각했습니다. 같은 것 :

map.connect ':lang/posts/:id', :controller => 'posts', :action => 'show', :lang => nil
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top