2013-07-26 13 views
5

JSON çıktısını, bir Kullanıcı'nın oluşturulmasında nasıl özelleştirebilirim?Kullanıcı hesabının oluşturulmasında kullanıcı tanımlı JSON yanıtını özelleştirme

### User.rb ### 
class User < ActiveRecord::Base 
    devise :database_authenticatable, 
     :registerable, ... 
    ... 
end 

### Routes.rb ### 
... 
devise_for :users, :controllers => {:registrations => "registrations"} 
... 

Ben gizli olan benim Kullanıcı tablosundaki bazı ekstra alanlar var ama ben böyle JSON aracılığıyla, Kullanıcı oluşturma ne zaman onlar JSON yanıt olarak döndürülen olsun:

$ curl -H "Content-Type: application/json" -d '{"user" : {"username":"someone","email":"[email protected]","password":"awesomepass"}}' -X POST http://localhost:3000/users.json 

döndürür :

{"user":{"secret_field_1":"some value","secret_field_2":"some value","created_at":"2013-07-25T21:24:50-05:00","email":"[email protected]","first_name":null,"id":3226,"last_name":null,"updated_at":"2013-07-25T21:24:50-05:00","username":"someone"}} 

o gizli alanları gizlemek istediğiniz, ancak JSON yanıtını özelleştirmek için nasıl bilmiyorum. Çünkü hazırlamak ait tahmin ediyorum, boşuna

class UserSerializer < ActiveModel::Serializer 
    attributes :id, :created_at, :updated_at, :email, :first_name, :last_name, :username 
end 

:

Ben standart ActiveRecord seri hale denedim.

cevap

-1

Bu JSON ile ne yaptığınıza bağlı olarak, seri hale getiricinizden istemediğiniz nitelikleri kaldırmanız yeterlidir. Örneğin

:

class UserSerializer < ActiveModel::Serializer 
    attributes :id, :email, :username 
end 

sizin durumunuzda, sadece bunu istiyorum, farz.

Ama aynı zamanda, belirli bir koşula bir özellik eklemeniz olanağına sahip:

class PostSerializer < ActiveModel::Serializer 
    attributes :id, :title, :body, :author 

    def include_author? 
    current_user.admin? 
    end 
end 

Ve nihayet, ihtiyacınız karma dönmek nitelikleri yöntemi geçersiz kılabilirsiniz:

class PersonSerializer < ActiveModel::Serializer 
    attributes :first_name, :last_name 

    def attributes 
    hash = super 
    if current_user.admin? 
     hash["ssn"] = object.ssn 
     hash["secret"] = object.mothers_maiden_name 
    end 
    hash 
    end 
end 

README Bkz Daha fazla bilgi için ActiveModel::Serializers.

+1

Diziselleştirici çalışmıyor. Sahip olduğum serileştirici kodu gizli alanları içermiyor, ancak JSON çıkışı hala çalışıyor. –

+0

Rails'in serileştiriciden geçtiğinden emin misiniz? Belki de neler olduğunu görmek için bir binding.pry'yi bu serializer'a bırakmayı denemelisiniz. Else, github veya başka bir yere projenin bir örneğini karşılık gelen Gemfile (.lock) ile yüklemeye çalışın, ona bir bakacağım. – Simon

8

Sadece aynı sorunla karşılaştım. Tam olarak neden belirledim ama Devise's SessionsController'da (Devise 3.0 ve active_model_serializers 0.8.1'de test edilmiş) respond_with gibi görünüyor, ActiveModel::Serializer'u tetiklemiyor.

Yani benim denetleyicisi respond_with overrode:

class SessionsController < Devise::SessionsController 

    def respond_with(resource, opts = {}) 
    render json: resource # Triggers the appropriate serializer 
    end 

end 

O respond_with ile benim RegistrationsController çalışan, ancak, olduğunu. Sadece bir tahmin

class RegistrationsController < Devise::RegistrationsController 

    respond_to :json 
end 
+0

İki müşteri denetleyicisini oluşturmak için ne yaptınız? Ayrıca, route.rb dosyanız nasıl görünüyor? –

0

ancak seri hale bulamıyor ve to_json() kullanıyor raylar gibi geliyor: Orada aşağıdakileri yapmak gerekiyordu. Modelinizde active_model_serializer() tanımladınız mı?

+0

Diziselleştirici UserSerializer ise ve sınıf adı Kullanıcı ise otomatik olarak algılanır. – mattwindwer

2

Son zamanlarda buna rastladım ve respond_with geçersiz kılma sorunu çözmedi. Ben şöyle user.rb içinde to_json geçersiz kılma sona erdi:

def to_json(arg) 
    UserSerializer.new(self).to_json 
end 

emin değil ekstra arg nedir, ama bu vasiyetle Mixins biri tarafından gerekli gibi görünüyor.

aşağıdaki kullanıyorum:

  • Raylar 4.2.0
  • hazırlamak 3.4.1
0

Ben sadece bunu çözüme nasıl aşağıda, çok basit, aynı problem vardı .

active_model_serializers (0.9.5)

geçersiz kıl Devise kayıt yönteminde, ve özelleştir eylem Tüm bu geçti:

def registration 
    //Some process, and you get a @user when registration is successful. 

    render :json => UserSerializer.new(@user) 
end 

Özelleştirilmiş Serializer (örneğin belirteci) bazı parametrelerini geçirmek istiyorsanız

yapabilirsiniz senin eylem geçmek:

render :json => UserSerializer.new(@user).as_json({auth_token: your_token}) 

Ve serileştiriciye içinde, sadece kullanın: