На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > RoR - возврат в XML формате !?
      Всем привет !
      Прошу помочь в таком вопросе :
      Есть простой клиент

      ExpandedWrap disabled
        #!/usr/bin/ruby
        require 'rubygems'
        require 'httpclient'
        require 'builder'
        require 'active_support'
        def smp_request(http_method, url, options = {})
                  return nil if url.nil? || url.size == 0
                #options["tokenid"] = "#{ROBOT_CLIENT_TOKEN}"
                  p options if options.size > 0
                  clnt = HTTPClient.new
                  http_method = "get" unless ["get", "post"].include?(http_method)
                  puts "url is:#{url}"
                  begin
                           case http_method
                                    when "get"
                                             puts "Request get ..."
                                             request = clnt.get(url, options)
                                             puts "Request get ... executed"    
                                        request.body
                                    when "post"
                                             puts "Request post ..."    
                                             request = clnt.post(url, options)
                                             puts "Request post ... executed"
                                        request.body        
                   end
                  rescue
                           puts "There is error"
                           return nil
                  else
                           puts "Request status = #{request.status}"
                           return request
                  end
        end
        puts "Input Name :"
        name = gets.chomp
        puts "Input Mail :"
        mail = gets.chomp
        puts "Input Pass :"
        pass = gets.chomp
        host = "http://localhost:3000/users/post"
        method = "post"
        data = {:login => name, :mail => mail, :password => pass}
        resp = smp_request(method, host, data)
        puts resp.body


      отсылающий на сервер некие данные пользователя, код метода обработки простой

      ExpandedWrap disabled
        def post
            @user = User.new(:login => params[:login], :email => params[:mail], :password => params[:password])
            
            respond_to do |accepts|
                    if @user.save
                              accepts.html
                              accepts.xml { render :xml => @user.to_xml(:except => [:created_at, :updated_at]) }
                else
                        format.html { render :action => "new" }
                        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
                      end        
            end
        end



      Юзер на стороне сервера создается и в соответствующем отображение в браузере это видно !!!
      Хотелось бы что бы в ответ от сервера приходил XML файл с данными только что созданного юзера, но приходит HTML код....

      Помогите разобрать ! Спасибо !
        может ?
        host = "http://localhost:3000/users/post.xml"
          Пробовал - выдает :
          ExpandedWrap disabled
            gafas@amd64:~/ruby-prj/test/client$ ruby client.rb
            Input Name :
            username
            Input Mail :
            username@mail.ru
            Input Pass :
            124sf12ts
            {:password=>"124sf12ts", :mail=>"username@mail.ru", :login=>"username"}
            url is:http://localhost:3000/users/post.xml
            Request post ...
            Request post ... executed
            Request status = 405
            <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
              <title>Action Controller: Exception caught</title>
              <style>
                body { background-color: #fff; color: #333; }
                body, p, ol, ul, td {
                  font-family: verdana, arial, helvetica, sans-serif;
                  font-size:   13px;
                  line-height: 18px;
                }
                pre {
                  background-color: #eee;
                  padding: 10px;
                  font-size: 11px;
                }
                a { color: #000; }
                a:visited { color: #666; }
                a:hover { color: #fff; background-color:#000; }
              </style>
            </head>
            <body>
            <h1>
              ActionController::MethodNotAllowed
              
            </h1>
            <pre>Only get, put, and delete requests are allowed.</pre>
            <p><code>RAILS_ROOT: /home/gafas/ruby-prj/test</code></p>
            <div id="traces">
              
                
                <a href="#" onclick="document.getElementById('Framework-Trace').style.display='none';document.getElementById('Full-Trace').style.display='none';document.getElementById('Application-Trace').style.display='block';; return false;">Application Trace</a> |
              
                
                <a href="#" onclick="document.getElementById('Application-Trace').style.display='none';document.getElementById('Full-Trace').style.display='none';document.getElementById('Framework-Trace').style.display='block';; return false;">Framework Trace</a> |
              
                
                <a href="#" onclick="document.getElementById('Application-Trace').style.display='none';document.getElementById('Framework-Trace').style.display='none';document.getElementById('Full-Trace').style.display='block';; return false;">Full Trace</a>
              
              
                <div id="Application-Trace" style="display: block;">
                  <pre><code>/usr/lib/ruby/1.8/action_controller/routing/recognition_optimisation.rb:64:in `recognize_path'
            /usr/lib/ruby/1.8/action_controller/routing/route_set.rb:441:in `recognize'
            /usr/lib/ruby/1.8/action_controller/routing/route_set.rb:436:in `call'</code></pre>
                </div>
              
                <div id="Framework-Trace" style="display: none;">
                  <pre><code>/usr/lib/ruby/1.8/action_controller/routing/recognition_optimisation.rb:64:in `recognize_path'
            /usr/lib/ruby/1.8/action_controller/routing/route_set.rb:441:in `recognize'
            /usr/lib/ruby/1.8/action_controller/routing/route_set.rb:436:in `call'
            /usr/lib/ruby/1.8/action_controller/dispatcher.rb:87:in `dispatch'
            /usr/lib/ruby/1.8/action_controller/dispatcher.rb:121:in `_call'
            /usr/lib/ruby/1.8/action_controller/dispatcher.rb:130:in `build_middleware_stack'
            /usr/lib/ruby/1.8/active_record/query_cache.rb:29:in `call'
            /usr/lib/ruby/1.8/active_record/query_cache.rb:29:in `call'
            /usr/lib/ruby/1.8/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache'
            /usr/lib/ruby/1.8/active_record/query_cache.rb:9:in `cache'
            /usr/lib/ruby/1.8/active_record/query_cache.rb:28:in `call'
            /usr/lib/ruby/1.8/active_record/connection_adapters/abstract/connection_pool.rb:361:in `call'
            /usr/lib/ruby/1.8/action_controller/string_coercion.rb:25:in `call'
            /usr/lib/ruby/1.8/rack/head.rb:9:in `call'
            /usr/lib/ruby/1.8/rack/methodoverride.rb:24:in `call'
            /usr/lib/ruby/1.8/action_controller/params_parser.rb:15:in `call'
            /usr/lib/ruby/1.8/action_controller/session/cookie_store.rb:93:in `call'
            /usr/lib/ruby/1.8/action_controller/failsafe.rb:26:in `call'
            /usr/lib/ruby/1.8/rack/lock.rb:11:in `call'
            /usr/lib/ruby/1.8/rack/lock.rb:11:in `synchronize'
            /usr/lib/ruby/1.8/rack/lock.rb:11:in `call'
            /usr/lib/ruby/1.8/action_controller/dispatcher.rb:114:in `call'
            /usr/lib/ruby/1.8/action_controller/reloader.rb:34:in `run'
            /usr/lib/ruby/1.8/action_controller/dispatcher.rb:108:in `call'
            /home/gafas/ruby-prj/test/vendor/rails/railties/lib/rails/rack/static.rb:31:in `call'
            /usr/lib/ruby/1.8/rack/urlmap.rb:47:in `call'
            /usr/lib/ruby/1.8/rack/urlmap.rb:41:in `each'
            /usr/lib/ruby/1.8/rack/urlmap.rb:41:in `call'
            /home/gafas/ruby-prj/test/vendor/rails/railties/lib/rails/rack/log_tailer.rb:17:in `call'
            /usr/lib/ruby/1.8/rack/content_length.rb:13:in `call'
            /usr/lib/ruby/1.8/rack/chunked.rb:15:in `call'
            /usr/lib/ruby/1.8/rack/handler/mongrel.rb:67:in `process'
            /usr/lib/ruby/1.8/rack/handler/mongrel.rb:38:in `run'
            /home/gafas/ruby-prj/test/vendor/rails/railties/lib/commands/server.rb:111
            /usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
            /usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require'
            script/server:3</code></pre>
                </div>
              
                <div id="Full-Trace" style="display: none;">
                  <pre><code>/usr/lib/ruby/1.8/action_controller/routing/recognition_optimisation.rb:64:in `recognize_path'
            /usr/lib/ruby/1.8/action_controller/routing/route_set.rb:441:in `recognize'
            /usr/lib/ruby/1.8/action_controller/routing/route_set.rb:436:in `call'
            /usr/lib/ruby/1.8/action_controller/dispatcher.rb:87:in `dispatch'
            /usr/lib/ruby/1.8/action_controller/dispatcher.rb:121:in `_call'
            /usr/lib/ruby/1.8/action_controller/dispatcher.rb:130:in `build_middleware_stack'
            /usr/lib/ruby/1.8/active_record/query_cache.rb:29:in `call'
            /usr/lib/ruby/1.8/active_record/query_cache.rb:29:in `call'
            /usr/lib/ruby/1.8/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache'
            /usr/lib/ruby/1.8/active_record/query_cache.rb:9:in `cache'
            /usr/lib/ruby/1.8/active_record/query_cache.rb:28:in `call'
            /usr/lib/ruby/1.8/active_record/connection_adapters/abstract/connection_pool.rb:361:in `call'
            /usr/lib/ruby/1.8/action_controller/string_coercion.rb:25:in `call'
            /usr/lib/ruby/1.8/rack/head.rb:9:in `call'
            /usr/lib/ruby/1.8/rack/methodoverride.rb:24:in `call'
            /usr/lib/ruby/1.8/action_controller/params_parser.rb:15:in `call'
            /usr/lib/ruby/1.8/action_controller/session/cookie_store.rb:93:in `call'
            /usr/lib/ruby/1.8/action_controller/failsafe.rb:26:in `call'
            /usr/lib/ruby/1.8/rack/lock.rb:11:in `call'
            /usr/lib/ruby/1.8/rack/lock.rb:11:in `synchronize'
            /usr/lib/ruby/1.8/rack/lock.rb:11:in `call'
            /usr/lib/ruby/1.8/action_controller/dispatcher.rb:114:in `call'
            /usr/lib/ruby/1.8/action_controller/reloader.rb:34:in `run'
            /usr/lib/ruby/1.8/action_controller/dispatcher.rb:108:in `call'
            /home/gafas/ruby-prj/test/vendor/rails/railties/lib/rails/rack/static.rb:31:in `call'
            /usr/lib/ruby/1.8/rack/urlmap.rb:47:in `call'
            /usr/lib/ruby/1.8/rack/urlmap.rb:41:in `each'
            /usr/lib/ruby/1.8/rack/urlmap.rb:41:in `call'
            /home/gafas/ruby-prj/test/vendor/rails/railties/lib/rails/rack/log_tailer.rb:17:in `call'
            /usr/lib/ruby/1.8/rack/content_length.rb:13:in `call'
            /usr/lib/ruby/1.8/rack/chunked.rb:15:in `call'
            /usr/lib/ruby/1.8/rack/handler/mongrel.rb:67:in `process'
            /var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:159:in `process_client'
            /var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `each'
            /var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `process_client'
            /var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run'
            /var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `initialize'
            /var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `new'
            /var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run'
            /var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `initialize'
            /var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `new'
            /var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `run'
            /usr/lib/ruby/1.8/rack/handler/mongrel.rb:38:in `run'
            /home/gafas/ruby-prj/test/vendor/rails/railties/lib/commands/server.rb:111
            /usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
            /usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require'
            script/server:3</code></pre>
                </div>
              
            </div>
            <h2 style="margin-top: 30px">Request</h2>
            <p><b>Parameters</b>: <pre>{"mail"=>"username@mail.ru",
             "login"=>"username",
             "password"=>"124sf12ts"}</pre></p>
            <p><a href="#" onclick="document.getElementById('session_dump').style.display='block'; return false;">Show session dump</a></p>
            <div id="session_dump" style="display:none"><pre class='debug_dump'>---
            </pre></div>
            <h2 style="margin-top: 30px">Response</h2>
            <p><b>Headers</b>: <pre>{"Content-Type"=>"",
             "Allow"=>"GET,
             PUT,
             DELETE",
             "Cache-Control"=>"no-cache"}</pre></p>
            </body>
            </html>


          Пользователь при этом не создается !!!
            покажи routes.rb
              ExpandedWrap disabled
                ActionController::Routing::Routes.draw do |map|
                  map.resources :users
                 
                  map.root :controller => "home"
                  
                  map.connect ':controller/:service.wsdl', :action =>'wsdl'
                  map.connect ':controller/:action/:id'
                  map.connect ':controller/:action/:id.:format'
                  map.connect ':controller/:action/:login'
                  map.connect ':controller/:action/:login.:format'
                я может чего не понимаю
                но ты объявляешь ресурс users а внем не должно быть экшена post
                там полный REST http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions
                  если честно - тут уже я что то не понимаю ....
                  Я модель и все остальное создал с помощью scaffold - и в соответствующем контроллере добавил отдельный метод для POST запросов из вне, так сказать для наглядности .... выходит я что то не так делаю !?
                    Цитата Megathrone @
                    выходит я что то не так делаю

                    ну есть немного

                    в рельсах для управления ресурсами применяется (хрен знает как это называется) REST
                    то есть когда ты в routes.rb делаешь map.resources :users у тебя автоматом создаются вот такие вот пути запросов
                    HTTP методпутьметод контроллеранужен, что бы
                    GET/usersindexполучить всех пользователей
                    GET/users/newnewрисует форму для нового пользователя
                    POST/userscreateсоздает нового пользователя (как раз то что тебе и нужно)
                    GET/users/:idshowотдает информацию о конкретном пользователе
                    GET/users/:id/editeditрисует форму для редактирования пользователя
                    PUT/users/:idupdateизменяет информацию о пользователе
                    DELETE/users/:iddestroyудаляет пользователя


                    То есть тебе надо вызвать POST /users (или POST /users.xml если у тебя данные о пользователе в xml), в методе create делать редирект на /users/:id.xml (id, ты уже должен занать, так как ты его только что построил) и если твой http клиент не умеет обрабатывать редиректы, то либо его надо научить либо обрабатывать это в ручную
                      Не забываем, что чтобы в ответ вернулось XML и сработал соответствующий respond_to, необходимо явно в запросе об этом сказать. Что причем наглядно видно из кода!
                      URL вида post.xml с этим вообще никак не связан.

                      Добавлено
                      Хотя, блин, код тут довольно хитроват..
                        Цитата deil @
                        Не забываем, что чтобы в ответ вернулось XML и сработал соответствующий respond_to, необходимо явно в запросе об этом сказать. Что причем наглядно видно из кода!
                        URL вида post.xml с этим вообще никак не связан.

                        то есть можно опустить все эти .xml и просто в http запросе установить заголовок типа Accept: application/xml? и все правильно вернется? (ну если конечно в коде это реализовано)
                          Ну глянь на роутинги: там прописано, что .xml в запросе /post.xml распарсится просто в переменную params[:format], не более того.
                          respond_to же выбирает, что рендерить - как раз по полю Accept
                            понятно спасибо
                              Выходит что все таки нужно установить Accept: application/xml при формирование ПОСТ запроса, для того что бы в ответ получить XML !?
                                Ну очень на то похоже..

                                Добавлено
                                Если честно, меня этот код уже запутал :lol: По сути, должен работать.
                                Я бы почитал код accepts и format
                                  Вариант 1

                                  ExpandedWrap disabled
                                    respond_to do |format|
                                          format.xml  { render :xml => @user }
                                        end


                                  Вариант 2

                                  Создать rxml темплейт вместо стандратной erb вьюшки. Вот это сработает на 250 процентов.
                                    То есть можно так :
                                    в методе контроллера делаем
                                    ExpandedWrap disabled
                                          
                                      respond_to do |format|
                                             format.xml  { render :xml => @user }
                                      end


                                    а в соответствующей вюшке что то на подобие
                                    ExpandedWrap disabled
                                      xml.instruct!
                                       
                                      xml.feed "xmlns" => "http://www.w3.org/2005/Atom" do
                                       
                                        @user.each do |user|
                                          xml.entry do
                                            xml.title   user.title
                                            xml.id      url_for(:only_path => false, :controller => 'user', :action => 'show', :id => user.id)
                                            xml.mail    user.name
                                          end
                                        end
                                       
                                      end

                                    Соответственно сохраняем её как <method_name>.rxml !!!

                                    Так должно прокатить !?
                                    Сообщение отредактировано: Megathrone -
                                      Возник вопрос:
                                      ExpandedWrap disabled
                                            def post
                                                @user = User.new(:login => params[:login], :email => params[:mail], :password => params[:password])
                                            
                                                respond_to do |accepts|
                                                        if @user.save
                                                                  accepts.html
                                                                  accepts.xml { render :xml => @user.to_xml(:except => [:created_at, :updated_at]) }
                                                    else
                                                            format.html { render :action => "new" }
                                                            format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
                                                          end        
                                                end
                                            end


                                      Откуда здесь переменная format!?
                                        Цитата Megathrone @
                                        Так должно прокатить !?

                                        В контроллере необязательно вызывать respond_to. Вытащил юзера и все. Вьюшку оформил правильно, посему тебе вернется твой xml.

                                        Цитата deil @
                                        Откуда здесь переменная format!?

                                        Верный вопрос, явно видно что там accepts. :)
                                          Вопрос не по теме, но все же задам здесь что бы ветку не засорять....
                                          Есть ли у кого то книга "Рецепты Rails" в электронном варианте ? Если есть - залейте куда то !
                                          Спасибо !
                                            Вот:
                                            Что-то не аттачится. Позже залью.
                                            Сообщение отредактировано: Мохнатый -
                                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                            0 пользователей:


                                            Рейтинг@Mail.ru
                                            [ Script execution time: 0,0725 ]   [ 15 queries used ]   [ Generated: 23.04.24, 22:37 GMT ]