8

デバイス ユーザーの作成時に JSON 出力をカスタマイズするにはどうすればよいですか?

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

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

User テーブルに秘密の追加フィールドがいくつかありますが、JSON を介して次のように User 作成を行うと、JSON 応答でそれらが返されます。

$ curl -H "Content-Type: application/json" -d '{"user" : {"username":"someone","email":"someone@somewhere.com","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":"someone@somewhere.com","first_name":null,"id":3226,"last_name":null,"updated_at":"2013-07-25T21:24:50-05:00","username":"someone"}}

これらの秘密のフィールドを非表示にしたいのですが、JSON 応答をカスタマイズする方法がわかりません。

標準の ActiveRecord シリアライザを試しました:

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

役に立たなかったのは、Devise のせいだと思います。

4

5 に答える 5

11

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

だから私はrespond_with自分のコントローラーでオーバーライドしました:

class SessionsController < Devise::SessionsController

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

end

ただし、私のRegistrationsControllerではrespond_with. そこで、次のことを行う必要がありました。

class RegistrationsController < Devise::RegistrationsController

  respond_to :json
end
于 2013-08-01T04:57:56.467 に答える
3

最近これに遭遇しましたが、オーバーライドrespond_withしても問題は解決しませんでした。to_json私は次のように user.rb でオーバーライドしてしまいました:

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

追加の引数が何であるかはわかりませんが、デバイス mixin の 1 つで必要になるようです。

私は以下を使用しています:

  • レール 4.2.0
  • 考案 3.4.1
于 2015-01-25T20:19:11.933 に答える
0

推測ですが、レールがシリアライザーを見つけられず、使用しているようto_json()です。モデルで定義active_model_serializer()しましたか?

于 2013-08-01T05:56:25.480 に答える
-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してください。

于 2013-07-31T10:51:26.830 に答える