2017-11-03 4 views
1

私のheroku RoRアプリケーションでは、私はJSON要求をサポートするコントローラを持っています。そこに私は次の機能を持っています:RORのJSON処理関数へのXMLサポートを追加

def mssg_as_json 
    @message = Message.new 
    @message.text = params.require(:messages) 
    @message.save 
    string = "http://link.com/" 
    @message.url = string + @message.id.to_s 
    @message.save 
    render json: { url: @message[:url] } 
end 

def return_mssg_as_json 
    if @message = Message.find_by(id: params[:id]) 
    render json: { message: @message[:text] } 
    else 
    render json: {errors: :not_found}, status: :not_found 
    end 
end 

XMLリクエストもサポートしたいと思います。私の考えは何とかXMLをJSONに変換することですが、どのように考えているのでしょうか。 XMLとJSONの両方をサポートするようにコードを変更するにはどうすればよいですか?

P.S. 私のルートは以下のとおりです。

get "messages/api" => "messages#return_mssg_as_json" 
post "messages/api" => "messages#mssg_as_json" 

要求が

+0

コントローラのどこかで 'respond_to do | format |'を使っていますか? – jvillian

+0

いいえ、私のルートに指定されたばかりです(投稿に追加しました) –

+1

あなたは間違っていると思います。私はちょっと答えを投稿します。 – jvillian

答えて

3

だから、あなたは標準的な経路とアクションを活用する必要があります/メッセージ/ APIにmain_urlに送信されています。お使いのコントローラが今api/v1内にネストされ

Rails.application.routes.draw do 
    resources :messages  
    namespace :api, defaults: {format: 'json'} do 
    namespace :v1 do 
     resources :messages 
    end 
    end 
end 

注:routes.rbでは、あなたのような何かをするかもしれません。これにより、パスをapiとして識別し、時間の経過とともにバージョンを維持することができます。その固体の練習。また、あなたのWebアプリケーション用の標準messagesリソースがあることにも注意してください。このコントローラは、Api::V1::BaseControllerから継承することを

class Api::V1::MessagesController < Api::V1::BaseController 

    def create 
    @message = Message.new(message_params) 
    respond_to do |format| 
     if @message.save 
     @message.update(url: "http://link.com/#{@message.id}") 
     format.json { render json: create_hsh, status: :ok } 
     format.xml { render xml: create_hsh, staus: :ok } 
     else 
     format.json { render json: @message.errors, status: :unprocessable_entity } 
     format.xml { render xml: @message.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def show 
    respond_to do |format| 
     if @message = Message.find_by(id: params[:id]) 
     format.json { render json: show_hsh, status: :ok } 
     format.xml { render xml: show_hsh, status: :ok } 
     else 
     format.json { render json: {errors: :not_found}, status: :not_found } 
     format.xml { render xml: {errors: :not_found}, status: :not_found } 
     end 
    end 
    end 

private 

    def create_hsh 
    @message.attributes.with_indifferent_access.slice(:url) 
    end 

    def show_hsh 
    attr = @message.attributes.with_indifferent_access 
    attr.slice(:foo, :bar).merge!(message: attr[:text]) 
    end 

    def message_params 
    params.require(:message).permit(:text) 
    end 

end 

注:

次に、あなたのコントローラは次のようになります。これは、API関連のクライアント認証(キー/トークンのチェックなど)を行うように設定したコントローラになります。おそらく、何かのように、:

class Api::V1::BaseController < ActionController::API 
    before_action :authorize 

    def authorize 
    # do your checks in a way that results in a variable @authorized? 
    render(json: {errors: :unauthorized}, status: :unauthorized) unless @authorized? 
    end 

end 

だから、今あなたは(あなたが提供することを選択した)すべてのフォーマットタイプに対応するために、単一のコントローラのアクションを使用しています。クライアントは次のように投稿します。

http://your.api.com/messages.json 

jsonレスポンスを得るにはOr:

http://your.api.com/messages.xml 

xml応答を取得するには:以下のビットが表示されます:namespace :api, defaults: {format: 'json'} do

http://your.api.com/messages 

をし、それがjsonフォーマットがデフォルトになります。これは、クライアントが呼び出すことができることを意味します。

今、あなたは(mssg_as_jsonのような)ランダムなエンドポイント、あなたの顧客が期待するだけで、通常のRESTfulなものの束を持っていません。あなたのAPIクライアントはあなたを愛するでしょう。

あなたはshow_hshは、以前の質問から受け入れられたコードであることに注意しましょう。

+0

作成と表示はWebパーツに使用されます。私はちょうど情報を得るために他のアプリのサポートを追加したい。 –

+0

はい、私はちょうど答えを更新したので、このアプローチのデフォルトは 'html'です。ですから、あなたは余分なアクションやコードを書かなくても、Webパーツ*と* APIパーツでこれを使うことができます。それは非常に一般的なパターンです。 – jvillian

+0

しかし私は他のすべてのURLを持っていたいと思っています.WEENはJSONとXMLのためのメッセージです/メッセージ/ api –

関連する問題