Использование ActiveResource POST для создания записи в другом приложении Rails - PullRequest
1 голос
/ 22 июня 2010

Есть 2 приложения App1 и App2, и я пытаюсь создать запись в таблице items App2 из App1, используя ActiveResource

Я хочу, чтобы это работало:

new_item = App2::Item.create(:property1 => "foo", :property2 => "bar")

Вот что я делаю:

В приложении 1:

module App2
    class Item < ActiveResource::Base
        self.site = "http://localhost:3001" # This is where App2 is running
        self.prefix = "api/create_item/"
        def self.create(params)
            begin
                @item = App2::Item.new(:property1 => params[:property1], :property2 => params[:property2] )
                if @item.save
                  format.xml { render :xml => @item, :status => :created, :location => @item }
                else
                  format.xml { render :xml => @item.errors, :status => :unprocessable_entity}
                end
              rescue ActiveResource::ResourceNotFound => ex
                puts ex.message
              end
        end
    end
end

В App2, КОНТРОЛЛЕР:

    module App2
        class ItemController < ApplicationController
            def create_item
                begin
                    @item = Item.new(:property1 => "foo", :property2 => "bar")
                    @item.save
                    respond_to do |format|
                      if @item.save
                        format.xml { render :xml => %Q[
                <?xml version="1.0" encoding="UTF-8"?>
                    <item>
                    <property1>#{item.property1}</property1>
                    <property2>#{item.property2}</property2>
                    </item>
                    ], :status => 200 }
                      else
                        format.xml { render :xml => %Q[<?xml version="1.0" encoding="UTF-8"?><error>Item was not created</error>], :status => 404 }
                      end
                    end
                  rescue Exception => ex
                        format.xml { render :xml => %Q[<?xml version="1.0" encoding="UTF-8"?><error>Item was not created. REASON: #{ex.message}</error>], :status => 404 }
                  end
            end
        end
    end

Приложение 2, МАРШРУТ:

map.connect 'api/create_item', :controller => 'app2/item', :action => "create_item", :conditions => {:method => :post}  

Когда я комментирую self.prefix = "api/create_item/", я вижу некоторые действия в хвосте App2:

Processing ApplicationController#routes_catchall (for 10.104.232.160 at 2010-06-22 13:07:01) [POST]
  Parameters: {"item"=>{"property1"=> "abc", "property2"=>"def"}, "action"=>"routes_catchall", "path"=>["items.xml"], "controller"=>"application"}
Rendering template within layouts/error
Rendering error/404 (404 Not Found)
Completed in 743ms (View: 726, DB: 1) | 404 Not Found [http://localhost:3001/items.xml]

и Failed with 404 Not Found в приложении 1

Я не вижу никаких действий, когда использую его с префиксом.

Что я испортил?

1 Ответ

0 голосов
/ 22 июня 2010

Ну, я только что нашел проблему:)
Проблема заключалась в маршруте, который не имел возможности отвечать на формат xml.поэтому мне пришлось изменить маршрут на

map.connect 'api/create_item/items.:format', :controller => 'app2/item', :action => "create_item", :conditions => {:method => :post}

I (ну, фактически, мой друг) отладил его, указав точный URL-адрес, по которому он попадал в connection.rb файле.

Надеюсь, это кому-нибудь поможет:)

...