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
しかし、これにはいくつかの問題があります:-
したがって、問題は、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:-私はこのファイルの作成を使用しようとしています。これは単なるサンプルです
[〜#〜]編集[〜#〜]
編集
{ { 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"
}
]
今私が欲しいのは、この各応答セクションをユーザー配列で囲むことです
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'
モデルにコードを実装することで、出力をカスタマイズできます。
def as_json(options={})
super(:only => [:name, :email])
end
次に、コントローラーで次を使用できます。
render :json => @user
詳細については、「 Rails to_jsonまたはas_json? "」を参照してください。
次の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] }
ビューをカスタマイズするには、 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
}
}]
フォーマットは簡単な部分ですが、あなたが求めていることは、あなたの視点ではなく、コントローラー内で達成されるべきだと私は信じています。
http://ar.rubyonrails.org/classes/ActiveRecord/Serialization.html#M000049 を参照し、to_json
を使用して、必要なものだけを出力するのではなく、実際に出力する方法を確認してください。オブジェクト全体がシリアル化されました。