2013-07-26 10 views
5

deviseユーザーの作成時にJSON出力をカスタマイズするにはどうすればよいですか?ユーザーアカウントの作成時にDeviseユーザーのJSON応答をカスタマイズする

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

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

私は秘密です、私のユーザーテーブル内のいくつかの余分なフィールドを持っているが、私はこのようなJSONを介してユーザの作成を行うときには、JSON応答で返されます:

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

返します:

{"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"}} 

これらの秘密のフィールドを非表示にしたいのですが、JSONレスポンスをカスタマイズする方法はわかりません。私が原因工夫の推測している、無駄に

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

私は、標準のActiveRecordのシリアライザを試みました。

答えて

-1

JSONを使って何をしているかによって、シリアライザから望ましくない属性を削除するだけで済みます。例えば

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

私はあなたのケースで、あなただけのことをしたい、と推定。

しかし、あなたはまた、特定の条件の属性を含める可能性があります。

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

    def include_author? 
    current_user.admin? 
    end 
end 

そして最後に、あなたが必要とするハッシュを返すために、属性のメソッドをオーバーライドすることができます

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詳細についてはActiveModel::Serializersをご覧ください。

+1

シリアライザが動作していません。私が持っているシリアライザコードには秘密のフィールドは含まれていませんが、JSONの出力はまだあります。 –

+0

Railsがシリアライザを通過していますか? 何が起こるかを見るために、そのシリアライザにbinding.pryをドロップしようとする必要があります。そうでなければgithubや他の場所に対応するGemfile(.lock)でプロジェクトのサンプルをアップロードしようとします。 – Simon

8

私はちょうど同じ問題に遭遇しました。私は正確に理由を特定していませんが、DeviseのSessionsController(Devise 3.0とactive_model_serializers 0.8.1でテスト済み)のrespond_withのように見えますが、ActiveModel::Serializerがトリガーされません。

だから、私は、コントローラにrespond_withをオーバーライド:

class SessionsController < Devise::SessionsController 

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

end 

それはrespond_withと私のRegistrationsControllerで働いて、しかし、です。ただの推測

class RegistrationsController < Devise::RegistrationsController 

    respond_to :json 
end 
+0

2つのカスタマーコントローラを生成するには、どうしましたか?また、routes.rbファイルはどのように見えますか? –

0

が、レールがあなたのシリアライザを見つけていないとto_json()を使用しているように聞こえる:そこ私は、次の操作を実行する必要がありました。あなたのモデルにactive_model_serializer()さんを定義しましたか?

+0

シリアライザがUserSerializerで、クラス名がUserの場合、自動的に検出されます。 – mattwindwer

2

私は最近この問題に遭遇し、respond_withを無効にしても問題は解決しませんでした。私はそうのようなuser.rbでto_jsonを上書きしてしまった:

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

ない余分なargが何であるかを確認してください、それは工夫のミックスインのいずれかによって要求されているようです。

私は、次の使用しています:

  • のRails 4.2.0
  • 工夫3.4.1
0

を私はちょうど私がそれを解決する方法以下、非常に簡単ですが、同じ問題を抱えていました。

active_model_serializers (0.9.5)

オーバーライド工夫登録方法では、あなたのカスタマイズアクションに渡されるすべてのこれら:

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

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

あなたがカスタマイズしたシリアライザ(例えばトークン)にいくつかのパラメータを渡したい場合は、することができますあなたの行動でそれを渡します

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

そして、あなたのシリアライザでは、単に使用します。

class UserSerializer < ActiveModel::Serializer 
    attributes :id, :name, :avatar_url, :auth_token 

    def auth_token 
    serialization_options[:auth_token] 
    end 
end 
関連する問題