Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.184.214] |
|
Сообщ.
#1
,
|
|
|
Всем привет !
Прошу помочь в таком вопросе : Есть простой клиент #!/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 отсылающий на сервер некие данные пользователя, код метода обработки простой 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 код.... Помогите разобрать ! Спасибо ! |
Сообщ.
#2
,
|
|
|
может ?
host = "http://localhost:3000/users/post.xml" |
Сообщ.
#3
,
|
|
|
Пробовал - выдает :
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> Пользователь при этом не создается !!! |
Сообщ.
#4
,
|
|
|
покажи routes.rb
|
Сообщ.
#5
,
|
|
|
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' |
Сообщ.
#6
,
|
|
|
я может чего не понимаю
но ты объявляешь ресурс users а внем не должно быть экшена post там полный REST http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions |
Сообщ.
#7
,
|
|
|
если честно - тут уже я что то не понимаю ....
Я модель и все остальное создал с помощью scaffold - и в соответствующем контроллере добавил отдельный метод для POST запросов из вне, так сказать для наглядности .... выходит я что то не так делаю !? |
Сообщ.
#8
,
|
|||||||||||||||||||||||||||||||||
|
Цитата Megathrone @ выходит я что то не так делаю ну есть немного в рельсах для управления ресурсами применяется (хрен знает как это называется) REST то есть когда ты в routes.rb делаешь map.resources :users у тебя автоматом создаются вот такие вот пути запросов
То есть тебе надо вызвать POST /users (или POST /users.xml если у тебя данные о пользователе в xml), в методе create делать редирект на /users/:id.xml (id, ты уже должен занать, так как ты его только что построил) и если твой http клиент не умеет обрабатывать редиректы, то либо его надо научить либо обрабатывать это в ручную |
Сообщ.
#9
,
|
|
|
Не забываем, что чтобы в ответ вернулось XML и сработал соответствующий respond_to, необходимо явно в запросе об этом сказать. Что причем наглядно видно из кода!
URL вида post.xml с этим вообще никак не связан. Добавлено Хотя, блин, код тут довольно хитроват.. |
Сообщ.
#10
,
|
|
|
Цитата deil @ Не забываем, что чтобы в ответ вернулось XML и сработал соответствующий respond_to, необходимо явно в запросе об этом сказать. Что причем наглядно видно из кода! URL вида post.xml с этим вообще никак не связан. то есть можно опустить все эти .xml и просто в http запросе установить заголовок типа Accept: application/xml? и все правильно вернется? (ну если конечно в коде это реализовано) |
Сообщ.
#11
,
|
|
|
Ну глянь на роутинги: там прописано, что .xml в запросе /post.xml распарсится просто в переменную params[:format], не более того.
respond_to же выбирает, что рендерить - как раз по полю Accept |
Сообщ.
#12
,
|
|
|
понятно спасибо
|
Сообщ.
#13
,
|
|
|
Выходит что все таки нужно установить Accept: application/xml при формирование ПОСТ запроса, для того что бы в ответ получить XML !?
|
Сообщ.
#14
,
|
|
|
Ну очень на то похоже..
Добавлено Если честно, меня этот код уже запутал По сути, должен работать. Я бы почитал код accepts и format |
Сообщ.
#15
,
|
|
|
Вариант 1
respond_to do |format| format.xml { render :xml => @user } end Вариант 2 Создать rxml темплейт вместо стандратной erb вьюшки. Вот это сработает на 250 процентов. |
Сообщ.
#16
,
|
|
|
То есть можно так :
в методе контроллера делаем respond_to do |format| format.xml { render :xml => @user } end а в соответствующей вюшке что то на подобие 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 !!! Так должно прокатить !? |
Сообщ.
#17
,
|
|
|
Возник вопрос:
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!? |
Сообщ.
#18
,
|
|
|
Цитата Megathrone @ Так должно прокатить !? В контроллере необязательно вызывать respond_to. Вытащил юзера и все. Вьюшку оформил правильно, посему тебе вернется твой xml. Цитата deil @ Откуда здесь переменная format!? Верный вопрос, явно видно что там accepts. |
Сообщ.
#19
,
|
|
|
Вопрос не по теме, но все же задам здесь что бы ветку не засорять....
Есть ли у кого то книга "Рецепты Rails" в электронном варианте ? Если есть - залейте куда то ! Спасибо ! |
Сообщ.
#20
,
|
|
|
Вот:
Что-то не аттачится. Позже залью. |