2010-08-30 55 views
1

我最近一直在嘗試升級我的應用程序形式的Rails 2.3.8到新版本的Rails 3RubyAmf和Rails 3

通過固定一些Rails 3的打算後RubyAMF似乎不工作:

>>>>>>>> RubyAMF >>>>>>>>> #<RubyAMF::Actions::PrepareAction:0x1649924> took: 0.00017 secs 
The action '#<ActionDispatch::Request:0x15c0cf0>' could not be found for DaysController 
/Users/tammam56/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0/lib/abstract_controller/base.rb:114:in `process' 
/Users/tammam56/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0/lib/abstract_controller/rendering.rb:40:in `process' 

它似乎無法找到合適的控制器。可能需要處理Rails 3路由器的新變化。你知道如何去尋找問題的根源和/或試圖解決它嗎?

我是從哪裏RubyAMF這種情況發生粘貼代碼(例外發生在該行:@ service.process(REQ,RES)):

 #invoke the service call 
     def invoke 
     begin 
      # RequestStore.available_services[@amfbody.service_class_name] ||= 
      @service = @amfbody.service_class_name.constantize.new #handle on service 

     rescue Exception => e 
      puts e.message 
      puts e.backtrace 
      raise RUBYAMFException.new(RUBYAMFException.UNDEFINED_OBJECT_REFERENCE_ERROR, "There was an error loading the service class #{@amfbody.service_class_name}") 
     end 

     if @service.private_methods.include?(@amfbody.service_method_name.to_sym) 
      raise RUBYAMFExc 

eption.new(RUBYAMFException.METHOD_ACCESS_ERROR, "The method {#{@amfbody.service_method_name}} in class {#{@amfbody.service_class_file_path}} is declared as private, it must be defined as public to access it.") 
    elsif [email protected]_methods.include?(@amfbody.service_method_name.to_sym) 
     raise RUBYAMFException.new(RUBYAMFException.METHOD_UNDEFINED_METHOD_ERROR, "The method {#{@amfbody.service_method_name}} in class {#{@amfbody.service_class_file_path}} is not declared.") 
    end 

    #clone the request and response and alter it for the target controller/method 
    req = RequestStore.rails_request.clone 
    res = RequestStore.rails_response.clone 

    #change the request controller/action targets and tell the service to process. THIS IS THE VOODOO. SWEET! 
    controller = @amfbody.service_class_name.gsub("Controller","").underscore 
    action  = @amfbody.service_method_name 
    req.parameters['controller'] = req.request_parameters['controller'] = req.path_parameters['controller'] = controller 
    req.parameters['action']  = req.request_parameters['action']  = req.path_parameters['action']  = action 
    req.env['PATH_INFO']   = req.env['REQUEST_PATH']    = req.env['REQUEST_URI']   = "#{controller}/#{action}" 
    req.env['HTTP_ACCEPT'] = 'application/x-amf,' + req.env['HTTP_ACCEPT'].to_s 

    #set conditional helper 
    @service.is_amf = true 
    @service.is_rubyamf = true 

    #process the request 
    rubyamf_params = @service.rubyamf_params = {} 
    if @amfbody.value && [email protected]? 
     @amfbody.value.each_with_index do |item,i| 
     rubyamf_params[i] = item 
     end 
    end 

    # put them by default into the parameter hash if they opt for it 
    rubyamf_params.each{|k,v| req.parameters[k] = v} if ParameterMappings.always_add_to_params 

    begin 
     #One last update of the parameters hash, this will map custom mappings to the hash, and will override any conflicting from above 
     ParameterMappings.update_request_parameters(@amfbody.service_class_name, @amfbody.service_method_name, req.parameters, rubyamf_params, @amfbody.value) 
    rescue Exception => e 
     raise RUBYAMFException.new(RUBYAMFException.PARAMETER_MAPPING_ERROR, "There was an error with your parameter mappings: {#{e.message}}") 
    end 
    @service.process(req, res) 

    #unset conditional helper 
    @service.is_amf = false 
    @service.is_rubyamf = false 
    @service.rubyamf_params = rubyamf_params # add the rubyamf_args into the controller to be accessed 

    result = RequestStore.render_amf_results 

    #handle FaultObjects 
    if result.class.to_s == 'FaultObject' #catch returned FaultObjects - use this check so we don't have to include the fault object module 
     e = RUBYAMFException.new(result['code'], result['message']) 
     e.payload = result['payload'] 
     raise e 
    end 

    #amf3 
    @amfbody.results = result 
    if @amfbody.special_handling == 'RemotingMessage' 
     @wrapper = generate_acknowledge_object(@amfbody.get_meta('messageId'), @amfbody.get_meta('clientId')) 
     @wrapper["body"] = result 
     @amfbody.results = @wrapper 
    end 
    @amfbody.success! #set the success response uri flag (/onResult) 
    end 

回答

2

最好的建議是嘗試rails3-amf。與RubyAMF相比,它目前嚴重缺乏功能,但它確實有效,並且一旦請求或我有時間,我就會添加新功能。

+0

謝謝@warhammerkid替代看起來不錯 – Tam 2010-09-02 18:05:45

+0

http://github.com/kainosnoema/ruby_amf似乎也工作 – Tam 2010-09-02 19:09:00