2012-02-03 2 views
3

아직 답변을 찾지 못했습니다. 세션을 성공적으로 공유하기 위해 Rails 앱과 Sinatra 앱 (Rails 앱의 config.ru에 마운트 됨)을 어떻게 얻을 수 있습니까? Rails가 세션 정보를 저장하기 위해 해시의 사용자 정의 하위 클래스를 사용하고 Rack :: Session :: Cookie를 사용하지 않기 때문에 Synatra 앱을 먼저 방문한 다음 Rails 앱을 방문하면 undefined method sweep for {}:Hash과 같은 오류가 발생합니다. 지금까지 내 코드 :Rails + Sinatra 앱 공유 세션

config.ru

map "/" do 
    run MyRailsApp::Application 
end 

map "/sinatra" do 
    use Rack::Session::Cookie, 
     key: "_app_session", 
     secret: "<SECRET_KEY>" 

    run MySinatraApp 
end 

설정/초기화/session_store.rb

MyRailsApp::Application.config.session_store :cookie_store, key: '_app_session' 

설정/초기화/secret_token.rb

MyRailsApp::Application.config.secret_token = "<SECRET_KEY>" # same as config.ru 

내가 놓친 것은 무엇입니까?

+0

Sinatra 앱에서 랙 플래시 (또는 다른 플래시 구현)를 사용하고 있습니까? – matt

+0

나는 sinatra-flash를 사용하고 있습니다. – codykrieger

+2

나는 무슨 일이 일어나고있는가? sinatra-flash는 "flash"키 아래에 (일반, 루비) 해쉬를 세션에 추가하고있다. Rails는 그 키 밑에있는 것이 무엇이든지'ActionDispatch :: Flash :: FlashHash' 객체가 될 것으로 기대하고,'sweep' 메소드를 호출하려고합니다. 따라서'{Hash}에 대한 정의되지 않은 메소드 스윕 '오류가 발생합니다. 가능한 해결 방법은 Sinatra 앱에서 기본 키 (예 :'flash (: my_flash) [: error] = "foo"') 대신 다른 키를 사용하는 것입니다. Rails와 Sinatra간에 갈 때 메시지를보기 위해 플래시를 사용하고 싶다면 도움이되지 않습니다. – matt

답변

4

sweepgrepActionDispatch::Flash::FlashHashflash 키 아래의 세션에 레일스가 저장하는 방법입니다.

Sinatra-Flash는 또한 세션의 flash 키를 사용하지만 일반 Hash 개체를 저장합니다. undefined method sweep for {}:Hash :

레일 그것이 FlashHash이라고 가정하고 거기에 sweep, 따라서 오류 메시지를 호출하려고시나 거기 넣어 Hash입니다 session['flash']에서 개체를 받고있다.

Sinatra 앱에서 플래시 대신 기본 키 (예 : flash(:my_flash)[:error]="foo")가 아닌 다른 키를 사용하는 것이 좋습니다.

레일즈와 시나트라 사이를 이동할 때 플래시를 사용하여 메시지를보고 싶다면 도움이되지 않습니다.

+0

감사합니다. 잘 했어. – codykrieger

0

"{} : 해시"에 대한 정의되지 않은 방법은 브라우저에 이전에 캐시 된 쿠키를 저장하는 것입니다. 응용 프로그램과 관련된 쿠키를 삭제하고 브라우저를 새로 고치십시오. 그것은 나를 위해 일했습니다.

관련 문제