Rails'de, bir görünüm kullanarak JSON'u nasıl render edersiniz?


125

Kullanıcı denetleyicinizde olduğunuzu ve bir gösteri isteği için bir json yanıtı almak istediğinizi varsayalım, görünümlerinizde / kullanıcılar / dizinde, show.json adında ve kullanıcılarınızın # show'dan sonra bir dosya oluşturabilirseniz iyi olur. eylem tamamlandığında dosyayı işler.

Şu anda aşağıdaki satırlarda bir şeyler yapmanız gerekiyor:

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

Ancak, otomatik olarak bu şekilde oluşturulan bir show.json dosyası oluşturabilirseniz iyi olurdu:

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

Bu beni tonlarca kederden kurtaracak ve denetleyicide json'umu işlediğimde aldığım korkunç derecede kirli hissi temizleyecekti.


Şimdi bu gönderiye baktığımda, bu beni pek kurtarmayacak gibi görünüyor, ama daha karmaşık vakalarım var, bunun baş ağrısına neden olduğunu söylediğimde bana güvenin
Matthew

1
Rails 3'te format.jsonbir show.json.erbdosya ile arama yapabilirsiniz . Cevabımı gör.
James Lim

Yanıtlar:


64

Kendi respond_tobloğunuzda buna benzer bir şey yapabilmelisiniz :

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

bu, şablonu içinde oluşturacaktır app/views/users/_show.json.erb.


5
Bu iyi, ancak erb'nin json oluşturmanın acı verici bir yolu olduğunu hemen göreceksiniz. Bazı alternatifler için cevabıma bakın.
tybro0103

1
Kısmi kullanmadan yapmanın bir yolu var mı?
Wylliam Judd

55

Bir görünüm eklemeyi deneyin users/show.json.erbBu, JSON formatı için bir talepte bulunduğunuzda işlenmelidir ve bunun da erb tarafından işlenmesinin avantajını elde edersiniz, böylece dosyanız böyle bir şeye benzeyebilir

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

9
Bunun @user.first_name.to_jsonyerine kullanmak isteyebilirsiniz escape_javascript. JS'nin izin verdiği ile kesinlikle JSON olanı arasında bazı ince farklar vardır . (Tarayıcılar kendi JSON ayrıştırıcılarını uygularken bu farklılıklar önem kazanıyor.)
James A. Rosen

1
JSON (JS'den farklı olarak) yalnızca çift tırnaklı dizeleri kabul ettiğinden, muhtemelen tek tırnak işaretlerini çift tırnak olarak değiştirmelisiniz.
Abe Voelker

1
Bu iyi, ancak erb'nin json oluşturmanın acı verici bir yolu olduğunu hemen göreceksiniz. Bazı alternatifler için cevabıma bakın.
tybro0103

Bunun eski bir cevap olduğunu biliyorum ama tamamen yanlış. to_json zaten biçimlendirilmiş bir json dizesi "" döndürecektir, böylece ortaya çıkan json hiçbir zaman fazladan tırnak işaretleri ("" değer "") ile geçerli olmayacaktır. Ayrıca, kullanıcı adı nil ise, sonuçta elde edilen json değer olarak "null" dizesine sahip olacaktır. Ayrıca <% =, giriş verilerindeki html karakterlerini karıştıracak html kaçışını kullanır.
d4n3

Sanırım etrafınızdaki alıntıları da kaldırmanız gerekiyor, <%= xyz.to_json %>aksi takdirde fazladan alıntılarla kalırsınız.
akostadinov

32

Diğerlerinin de belirttiği gibi, bir users / show.json görünümüne ihtiyacınız var, ancak şablon dili için göz önünde bulundurmanız gereken seçenekler var ...

ERB

Kutudan çıkar çıkmaz çalışır. HTML için harika, ancak bunun JSON için çok kötü olduğunu hemen anlayacaksınız.

RABL

Güzel çözüm. Bir bağımlılık eklemek ve DSL'sini öğrenmek zorunda.

JSON Oluşturucu

RABL ile aynı anlaşma: İyi çözüm. Bir bağımlılık eklemek ve DSL'sini öğrenmek zorunda.

Sade Yakut

Ruby, JSON oluşturmada harikadır ve to_jsonbir Hash veya AR nesnesini çağırabileceğiniz için öğrenecek yeni bir şey yoktur . Şablonlar için .rb uzantısını kaydetmeniz yeterlidir (bir başlatıcıda):

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

Ardından kullanıcıları / show.json.rb görünümünü oluşturun:

@user.to_json

Bu yaklaşım hakkında daha fazla bilgi için bkz. Http://railscasts.com/episodes/379-template-handlers


7
Raylar 4'te .ruby şablon işleyicisinin varsayılan olarak github.com/rails/rails/commit/de1060f4e02925c12004f2 olarak kaydedildiğini unutmayın, böylece .rb'yi kaydetmeyi atlayabilir ve dosyanızı users / show.json.ruby olarak adlandırabilirsiniz.
Tim Diggins

1
Ayrıca, bunu daha da güncellemek için json_builder, github.com/rails/jbuilder tarafından yerini almıştır .
Tim Diggins

27

ERb sözdizimine daha temiz bir alternatif arıyorsanız, RABL muhtemelen bunun için gördüğüm en güzel çözümdür. Diğer çözümler olan json_builder ve argonaut, biraz modası geçmiş görünüyor ve bazı yamalar olmadan Rails 3.1 ile çalışmayacak.

RABL bir mücevher aracılığıyla kullanılabilir veya GitHub deposuna göz atabilirsiniz; çok iyi örnekler

https://github.com/nesquena/rabl


21

Bu yanıtı, bu sayfada sona eren diğerlerinin iyiliği için güncellemek için.

Rails 3'te, adresinde bir dosya oluşturmanız yeterlidir views/users/show.json.erb. @userNesne görüş sunulacak (Bu html olurdu gibi.) Hatta gerek yok to_jsonartık.

Özetlemek gerekirse, sadece

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

ve

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

1
Bunu 1,5 yıl önce cevapladım. Günümüzde JSON'a ihtiyaç duyduğumda sadece response_with kullanıyorum örn respond_with @user, only: [:name]. Daha fazla bilgi için bu eğiticiye bakın .
James Lim

1
Sadece bu yanıta eklemek gerekirse, bu aslında iki nedenden dolayı tehlikelidir: yeni satırlardan ve ters eğik çizgilerden kaçmadığı için kullanıcı verilerinden enjeksiyon yapılmasına izin verir ve ayrıca <% = html verilerden kaçar, böylece örneğin Sean O'Connor kendi adını alır Sean O & apos; Connor'a karıştırıldı.
d4n3

10

Sadece show.json.erbiçeriğiyle dosya ekleyin

<%= @user.to_json %>

Bazen, denetleyicide bulunmayan bazı ekstra yardımcı yöntemlere ihtiyaç duyduğunuzda, yani image_path(@user.avatar)JSON'da ek özellikler oluşturmak için kullanışlıdır :

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

8
<%= raw(@user.to_json) %>HTML kaçışından kaçınılması gerekir . Yaptığım şey, bana istediğimi verdiği sürece to_json'a güvenmemdir, ancak başka bir şey yapmak istediğimde genellikle a ile şablonlandırırım { :blah => @user.the_blah }.to_json.
clacke


0

Ben RoR'da yeniyim, öğrendiğim şey bu. doğrudan bir json formatını işleyebilirsiniz

def YOUR_METHOD_HERE
  users = User.all
  render json: {allUsers: users} # ! rendering all users
END
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.