2016-08-29 4 views
0

ActionController :: Live로 레일 4.1.16에서 SSE를 구현하려고합니다. 하지만 계속해서 Can't modify frozen hash 오류가 발생합니다. 개발 중에이 오류가 발생합니다. 이 코드는 -고정 된 해시를 수정할 수 없습니다. Rails 4.1 및 SSE

내 오류 다시 추적이

def continuous_printer_energy_data 
response.headers['Content-Type'] = 'text/event-stream' 
sse = SSE.new(response.stream, event: 'time') 
begin 
    loop do 
    puts request.path 
    if(request.path == '/energy/printer/continuous') 
     sse.close 
     break 
    end 
    Energy.uncached do 
     a = Energy.last 
     sse.write({ :data => a }) 
     sleep 1 
    end 

    end 

rescue Exception => e 
    puts 'its a exception' 
    logger.error e.backtrace.join("\n") 
    sse.close 

ensure 
    sse.close 

end 

끝 - 도움에 미리

RuntimeError - can't modify frozen Hash: 
    actionpack (4.1.16) lib/action_dispatch/middleware/cookies.rb:309:in `[]=' 
    actionpack (4.1.16) lib/action_dispatch/middleware/cookies.rb:532:in `[]=' 
    actionpack (4.1.16) lib/action_dispatch/middleware/session/cookie_store.rb:110:in `set_cookie' 
    rack (1.5.5) lib/rack/session/abstract/id.rb:350:in `commit_session' 
    rack (1.5.5) lib/rack/session/abstract/id.rb:226:in `context' 
    rack (1.5.5) lib/rack/session/abstract/id.rb:220:in `call' 
    actionpack (4.1.16) lib/action_dispatch/middleware/cookies.rb:562:in `call' 
    activerecord (4.1.16) lib/active_record/query_cache.rb:36:in `call' 
    activerecord (4.1.16) lib/active_record/connection_adapters/abstract/connection_pool.rb:621:in `call' 
    activerecord (4.1.16) lib/active_record/migration.rb:380:in `call' 
    actionpack (4.1.16) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call' 
    activesupport (4.1.16) lib/active_support/callbacks.rb:82:in `run_callbacks' 
    actionpack (4.1.16) lib/action_dispatch/middleware/callbacks.rb:27:in `call' 
    actionpack (4.1.16) lib/action_dispatch/middleware/remote_ip.rb:76:in `call' 
    better_errors (2.1.1) lib/better_errors/middleware.rb:84:in `protected_app_call' 
    better_errors (2.1.1) lib/better_errors/middleware.rb:79:in `better_errors_call' 
    better_errors (2.1.1) lib/better_errors/middleware.rb:57:in `call' 
    actionpack (4.1.16) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call' 
    actionpack (4.1.16) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call' 
    railties (4.1.16) lib/rails/rack/logger.rb:38:in `call_app' 
    railties (4.1.16) lib/rails/rack/logger.rb:20:in `block in call' 
    activesupport (4.1.16) lib/active_support/tagged_logging.rb:68:in `block in tagged' 
    activesupport (4.1.16) lib/active_support/tagged_logging.rb:26:in `tagged' 
    activesupport (4.1.16) lib/active_support/tagged_logging.rb:68:in `tagged' 
    railties (4.1.16) lib/rails/rack/logger.rb:20:in `call' 
    quiet_assets (1.1.0) lib/quiet_assets.rb:27:in `call_with_quiet_assets' 
    request_store (1.3.1) lib/request_store/middleware.rb:9:in `call' 
    actionpack (4.1.16) lib/action_dispatch/middleware/request_id.rb:21:in `call' 
    rack (1.5.5) lib/rack/methodoverride.rb:21:in `call' 
    rack (1.5.5) lib/rack/runtime.rb:17:in `call' 
    activesupport (4.1.16) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call' 
    actionpack (4.1.16) lib/action_dispatch/middleware/static.rb:84:in `call' 
    rack (1.5.5) lib/rack/sendfile.rb:112:in `call' 
    railties (4.1.16) lib/rails/engine.rb:514:in `call' 
    railties (4.1.16) lib/rails/application.rb:144:in `call' 
    rack (1.5.5) lib/rack/content_length.rb:14:in `call' 
    puma (3.6.0) lib/puma/configuration.rb:225:in `call' 
    puma (3.6.0) lib/puma/server.rb:578:in `handle_request' 
    puma (3.6.0) lib/puma/server.rb:415:in `process_client' 
    puma (3.6.0) lib/puma/server.rb:275:in `block in run' 
    puma (3.6.0) lib/puma/thread_pool.rb:116:in `block in spawn_thread' 

감사합니다.

+0

'SSE = SSE.new (response.stream 이벤트 : '시간') '이 당신이'sse.write ({수행 할 때 너무 고정 된 해시를 반환 할 수 있습니다 :> = 데이터를 a})'그것을 수정해서는 안되며 에러를 던져야한다. –

답변

0

직접이 문제가 발생하여 AngularJS (또는 이와 비슷한 내용)을 사용하는 경우 프런트 엔드가 XFRF_TOKEN을 처리하는 방식 때문일 수 있습니다. 그렇다면 angular_rails_csrf 보석을 사용하십시오. 여기

더 : https://github.com/jsanders/angular_rails_csrf/issues/7