Railsでは、ビューを使用してJSONをどのようにレンダリングしますか?


125

ユーザーのコントローラーにいて、showリクエストに対するjson応答を取得したい場合は、views / users / dirにshow.jsonという名前のファイルを作成し、users#showの後に作成するとよいでしょう。アクションが完了すると、ファイルがレンダリングされます。

現在、あなたは次の行に沿って何かをする必要があります:

def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json{
      render :json => @user.to_json
    }
  end
end

しかし、次のように自動的にレンダリングされるshow.jsonファイルを作成するだけでよいのです。

def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json
  end
end

これは私に多くの悲しみを救い、コントローラーでjsonをレンダリングするときに得られる恐ろしい汚い感覚を洗い流します


今この投稿を見ると、これはあまり私を救うことはできないようですが、もっと複雑なケースがあります。これが頭痛の原因だと言ったら私を信じてください
Matthew

1
Rails 3ではformat.jsonshow.json.erbファイルを使用して呼び出すことができます。私の答えを見てください。
James Lim

回答:


64

あなたはあなたのrespond_toブロックでこのようなことをすることができるはずです:

respond_to do |format|
    format.json 
    render :partial => "users/show.json"
end

でテンプレートがレンダリングされapp/views/users/_show.json.erbます。


5
これは良いことですが、erbがjsonを生成するための苦痛な方法であることがすぐにわかります。いくつかの選択肢について私の答えを確認してください。
tybro0103 2013年

1
パーシャルを使わずにそれを行う方法はありますか?
ウィリアムジャッド2016

55

ビューを追加してみてください。users/show.json.erbこれは、JSON形式のリクエストを行うときにレンダリングされる必要があり、erbによってレンダリングされるという追加の利点も得られるため、ファイルは次のようになります。

{
    "first_name": "<%= @user.first_name.to_json %>",
    "last_name": "<%= @user.last_name.to_json %>"
}

9
@user.first_name.to_json代わりに使用したい場合がありescape_javascriptます。JSが許可するものと厳密には JSON との間には微妙な違いがあります。(そして、ブラウザーが独自のJSONパーサーを実装するにつれて、それらの違いは重要になっています。)
James A. Rosen

1
JSON(JSとは異なり)は二重引用符で囲まれた文字列のみを受け入れるため、おそらく単一引用符を二重引用符に変更する必要があります。
Abe Voelker 2012年

1
これは良いことですが、erbがjsonを生成するための苦痛な方法であることがすぐにわかります。いくつかの選択肢について私の答えを確認してください。
tybro0103 2013年

私はこれが古い答えであることを知っていますが、それは完全に間違っています。to_jsonは、フォーマット済みのjson文字列 ""を既に返すため、結果のjsonは、余分な引用符( "" value "")で有効になることはありません。また、ユーザーの名がnilの場合、結果のjsonには値として「null」という文字列が含まれます。また、<%=はhtmlエスケープを使用して、入力データのhtml文字を変換します。
d4n3

引用符も削除する必要があると思います<%= xyz.to_json %>。そうしないと、余分な引用符が残ります。
akostadinov

32

他の人が述べたように、users / show.jsonビューが必要ですが、テンプレート言語について検討するオプションがあります...

ERB

そのまま使用できます。HTMLには最適ですが、JSONにはひどいことがすぐにわかります。

RABL

良い解決策。依存関係を追加し、DSLを学ぶ必要があります。

JSONビルダー

RABLと同じ取引:良い解決策。依存関係を追加し、DSLを学ぶ必要があります。

プレーンルビー

RubyはJSONの生成に優れておりto_json、ハッシュまたはARオブジェクトを呼び出すことができるため、新たに学ぶことはありません。テンプレートの.rb拡張子を(イニシャライザで)登録するだけです。

ActionView::Template.register_template_handler(:rb, :source.to_proc)

次に、users / show.json.rbビューを作成します。

@user.to_json

このアプローチの詳細については、http://railscasts.com/episodes/379-template-handlersを参照してください


7
Rails 4では、.rubyテンプレートハンドラーはデフォルトでgithub.com/rails/rails/commit/de1060f4e02925c12004f2に登録されているため、.rbの登録をスキップして、ファイルにusers / show.json.rubyという名前を付けることができます。
Tim Diggins、2015

1
また、これをさらに更新するために、json_builderはgithub.com/rails/jbuilderに置き換えられました
Tim Diggins、2015

27

ERb構文のより明確な代替手段を探している場合、RABLはおそらくこれに対する最も優れたソリューションです。他のソリューションであるjson_builderとargonautはどちらも多少古くなっており、パッチを適用しないとRails 3.1では動作しません。

RABLは、gem経由で利用できるか、GitHubリポジトリをチェックアウトします。良い例も

https://github.com/nesquena/rabl


21

このページにたどり着く他の人のために、この回答を更新するだけです。

Rails 3では、でファイルを作成するだけですviews/users/show.json.erb@userオブジェクトがビューに利用できるようになります(それはHTMLのためになるだけのよう。)あなたも必要ありませんto_jsonもう。

要約すると、それは

# users contoller
def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json
  end
end

そして

/* views/users/show.json.erb */
{
    "name" : "<%= @user.name %>"
}

1
1。5年前に答えました。最近では、JSONが必要なときはいつでも、respond_withを使用していますrespond_with @user, only: [:name]。詳細については、このチュートリアルを参照してください。
James Lim

1
この回答に追加すると、これは実際には2つの理由で危険です。改行やバックスラッシュをエスケープしないためユーザーデータからのインジェクションが可能であり、また<%= htmlがデータをエスケープするため、たとえばSean O'Connorが彼の名前を持つことになりますショーンO&Connorに壊されました。
d4n3

10

show.json.erb内容を含むファイルを追加するだけです

<%= @user.to_json %>

コントローラで使用できない追加のヘルパーメソッドが必要な場合image_path(@user.avatar)や、JSONで追加のプロパティを生成するために何かが役立つ場合があります。

<%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %>

8
<%= raw(@user.to_json) %>HTMLエスケープを回避する必要があります。私がやっていることは、私が欲しいものを提供する限り、私はto_jsonに依存しているということです{ :blah => @user.the_blah }.to_json
clacke


0

これは私がRoRに初めて参加したことです。json形式を直接レンダリングできます

def YOUR_METHOD_HERE
  users = User.all
  render json: {allUsers: users} # ! rendering all users
END
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.