1

제 레일 어플리케이션에서 저는 사용자 인증을 위해 장치를 사용합니다. 나는 또한 전체 웹 사이트에 대해 i18n을 사용하며 각 사용자는 사용자 설정에서 자신 또는 특정 언어를 선택할 수 있습니다. 사용자가 지정된 로케일 세트로 웹 사이트를 탐색하거나 게스트이고 기본 로케일이 사용되는 경우 해당 로케일을 URL에 표시하지 않습니다. 여기 rspec 지원 파일의 확장 클래스에서 현재 개발자를 얻으십시오.

는 예제 : URL이 "anything.com/users/42"같은 것을, 그래서

가 게스트는 영어 (기본값) 버전을 사용하지만, 그녀 또는 그 경우는 영구적 (프랑스어로하지 변경 예를 들어 프랑스어 버전에 대한 링크를 클릭하면 url이 "anything.com/fr/users/42"로 바뀝니다. 해당 사용자가 로그인되어 있고 french를 기본 언어로 선택한 경우 다른 방법입니다.

이 내 응용 프로그램에서 완벽한 작동 내 application_controller

# app/controllers/application_controller.rb 
def default_locale 
    current_user ? current_user.locale : I18n.default_locale 
end 
helper_method :default_locale 

def default_url_options options={} 
    (I18n.locale.to_s.eql?(default_locale.to_s) ? { locale: nil } : { locale: I18n.locale }).merge options 
end 

에 다음 줄에 의해 실현된다.

하지만 테스트 할 때 문제가 있습니다. 일부 테스트에서 나는 League라는 기존 모델과 같은 표현이 있습니다

visit edit_league_path(@league) 
expect(page.current_path).to eq league_path(@league) 

가 리디렉션을 확인 할 수 있습니다. 리그 edit에 대한 작업은 관리자 만 허용됩니다.

나는 다음과 같은 방법으로 전에 (관리자가 아닌 사람) 나는 사용자가 로그인 한 고안 사용하고 있기 때문에 : 사용자를위한

# spec/support/controller_macros.rb 
module ControllerMacros 
    def login_user *user_roles 
    before(:each) do 
     @request.env['devise.mapping'] = Devise.mappings[:user] 
     user = FactoryGirl.create(:user, *user_roles) 
     user.confirmed_at = Time.zone.now 
     user.save 
     sign_in user 
    end 
    end 
end 

공장은 임의의 로케일로 임의 사용자를 만듭니다.

I도 (here을 논의 됨) application_controller에서 default_url_options이 RSpec에 테스트에서 무시되기 때문에, RSpec에 시험을위한 현지화를 해결 지원 파일을 가지고 :

# spec/support/fix_localization.rb 
# workaround, to set default locale for ALL spec 
class ActionView::TestCase::TestController 
    def default_url_options options={} 
    { locale: I18n.locale }.merge options 
    end 
end 

class ActionDispatch::Routing::RouteSet 
    def default_url_options options={} 
    { locale: I18n.locale }.merge options 
    end 
end 

이제 내 문제는, 그 기본 i18n 로켈 집합 (예 : en)을 사용하여 로그인 한 사용자가 리그의 편집 페이지를 방문하면 해당 페이지를 방문 할 수 없기 때문에 리디렉션됩니다. 리디렉션은 application_controller에서 default_url_options 메서드를 고려하며 /en/leagues/42 (테스트가 예상 한대로)으로 리디렉션하지 않고 /leagues/42으로 리디렉션합니다.

이 문제의 해결책은 spec/support/fix_localization.rbdefault_url_options 메서드를 application_controller과 동일하게 변경하는 것이지만 지원 파일에서 현재 사용자에게 액세스 할 수 없습니다.

현재 사용자 나 다른 아이디어 또는 문제 해결 방법에 액세스하는 방법에 대한 아이디어가 있습니까?

미리 감사드립니다.

답변

0

코드를 복제하지 않고 해결책을 찾았습니다.사용되는 ApplicationController에서 상속 현재 사용 컨트롤러 (subject)에서, 그래서 지금

# spec/support/fix_localization.rb 
# workaround, to set default locale for ALL spec 
class ActionView::TestCase::TestController 
    def default_url_options options={} 
    subject.default_url_options options 
    end 
end 

default_url_options 방법 : 난 그냥 내 spec/support/fix_localization.rb 파일을 변경했습니다.

기술적으로는 내 질문에 대답하지 않지만 근본적인 문제를 해결합니다.

subject.current_user 

을하지만이 주제는 컨트롤러 지원 파일에서만 사용할 수 있습니다 : (원래 질문으로) 현재 사용자를 얻으려면, 하나는뿐만 아니라 subject를 사용할 수 있습니다.