web-dev-qa-db-ja.com

複雑なJson応答をRuby in rails

Ruby on Railsプロジェクトに取り組んでおり、Jsonへの応答を追加したいと思います。

簡単な方法の1つは次のとおりです。-

def index
  @users = User.all
  respond_to do |format|
    format.html # index.html.erb
    format.xml  { render :xml => @users }
    format.json  { render :json => @users.to_json }
  end
end

しかし、これにはいくつかの問題があります:-

  1. パスワードハッシュやキャッシュカウンター属性など、json応答でユーザーオブジェクト全体を提供したくありません。 Facebook、Twitterの属性など。
  2. 各ユーザーによる最新の質問、各ユーザーによる最新の回答など、jsonオブジェクト(スタックオーバーフローモデルを考慮)に詳細を追加したいと思います。 Paperclipを介してdbに保存されている画像名の代わりに、画像の完全なURLを渡したいと思います。

したがって、問題は、index.html.erbで行うように、index.json.erbファイルでjson応答をどのようにコーディングできるかということです。必要に応じて、独自のjson応答をフォーマットします。

[〜#〜]編集[〜#〜]

def index
  @users = User.all
  respond_to do |format|
    format.html # index.html.erb
    format.xml  { render :xml => @users }
    format.json  { render :file => "index.json.erb", :content_type => 'application/json' }
  end
end

index.json.erbファイル:-

    <% @users.each do |user| %>
    {
      first_name: <%= user.first_name %>,
      last_name: <%= user.last_name %>  
    }

    <% end %>

エラー: -

テンプレートがありません。

PS:-私はこのファイルの作成を使用しようとしています。これは単なるサンプルです

[〜#〜]編集[〜#〜]

enter image description here

編集

 { { first_name: Mohit , last_name: Jain } { first_name: Sahil Miglani, last_name: } { first_name: Hitesh Bansal, last_name: } { first_name: Sudhanshu, last_name: } { first_name: Saakshi, last_name: } { first_name: Kutta, last_name: } { first_name: bc, last_name: } { first_name: hey, last_name: } { first_name: fewhjfbwfb, last_name: vdsv } } 

[〜#〜]編集[〜#〜]

    [ { first_name: Mohit , last_name: Jain } , { first_name: Sahil Miglani, last_name: } , { first_name: Hitesh Bansal, last_name: } , { first_name: Sudhanshu, last_name: } , { first_name: Saakshi, last_name: } , { first_name: Kutta, last_name: } , { first_name: bc, last_name: } , { first_name: hey, last_name: } , { first_name: fewhjfbwfb, last_name: vdsv } ] 

編集、解決策を見つけるために非常に近い:-

    [
    <% @users.each_with_index do |user,index| %>
    {
        <%= "first_name".to_json.html_safe %>: <%= user.first_name.to_json.html_safe %>,
        <%= "last_name".to_json.html_safe %>: <%= user.last_name.to_json.html_safe %>  
    }
    <% unless index== @users.count - 1%>
    ,
    <% end %>
    <% end %>
    ]

応答:-

    [

       -
       {
           first_name: "Mohit "
           last_name: "Jain"
       }
       -
       {
           first_name: "Sahil Miglani"
           last_name: null
       }
       -
       {
           first_name: "Hitesh Bansal"
           last_name: null
       }
       -
       {
           first_name: "Sudhanshu"
           last_name: null
       }
       -
       {
           first_name: "Saakshi"
           last_name: null
       }
       -
       {
           first_name: "Kutta"
           last_name: null
       }
       -
       {
           first_name: "bc"
           last_name: null
       }
       -
       {
           first_name: "hey"
           last_name: null
       }
       -
       {
           first_name: "fewhjfbwfb"
           last_name: "vdsv"
       }

    ]

今私が欲しいのは、この各応答セクションをユーザー配列で囲むことです

17
Radio TukTuk

Json.erbファイルをレンダリングして、通常のテンプレートのように使用できます。

# file: app/views/your_controller/your_action.json.erb
{
  filed1: <%= @some_var %>,
  field2: <%= @another_var %>,
  fieldN: <%= @yet_another_var %>,
  data: <%= @some_data.to_json.html_safe %>
}

コントローラで、content_typeを使用して明示的なレンダリングを呼び出します。

render :file => "your_file.json.erb", :content_type => 'application/json'
20
Andrea Pavoni

モデルにコードを実装することで、出力をカスタマイズできます。

def as_json(options={})
  super(:only => [:name, :email])
end

次に、コントローラーで次を使用できます。

render :json => @user

詳細については、「 Rails to_jsonまたはas_json? "」を参照してください。

35
Devin M

次のJSON形式のオプションを送信できます。

  • :only(属性の明示的なリスト)
  • :except(属性除外リスト)
  • :methods(実行するメソッドのリストとその内容を含む)
  • :include(関係)

このJSON出力フォーマットを常に使用する場合は、それらをas_jsonメソッドに配置します(Devinの回答を参照)。

format.json  { render :json => @users.to_json{:only=>[:name, :email, :id], :methods=>[:last_question_answered], :include=>[:profile] }
11
Jesse Wolgamott

ビューをカスタマイズするには、 rabl gem を参照してください。

# app/views/posts/index.rabl
collection @posts
attributes :id, :title, :subject
child(:user) { attributes :full_name }
node(:read) { |post| post.read_by?(@user) }

それは生成します:

[{  post :
  {
    id : 5, title: "...", subject: "...",
    user : { full_name : "..." },
    read : true
  }
}]
5
JCorcuera

フォーマットは簡単な部分ですが、あなたが求めていることは、あなたの視点ではなく、コントローラー内で達成されるべきだと私は信じています。

http://ar.rubyonrails.org/classes/ActiveRecord/Serialization.html#M000049 を参照し、to_jsonを使用して、必要なものだけを出力するのではなく、実際に出力する方法を確認してください。オブジェクト全体がシリアル化されました。

0
Dhruva Sagar