2013-07-26 23 views
5

Làm cách nào để tùy chỉnh đầu ra JSON khi tạo Người dùng thành lập?Tùy chỉnh đưa ra phản hồi JSON của người dùng khi tạo tài khoản người dùng

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

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

tôi đã có một số trường bổ sung trong bảng tài khoản của tôi mà là bí mật, nhưng họ nhận được trả lại trong phản ứng JSON khi tôi làm một tạo tài khoản thông qua JSON như thế này:

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

trả về :

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

Tôi muốn ẩn các trường bí mật đó, nhưng không biết cách tùy chỉnh phản hồi JSON.

Tôi đã thử một ActiveRecord serializer tiêu chuẩn:

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

không có kết quả, tôi đoán vì lập mưu.

Trả lời

-1

Tùy thuộc vào những gì bạn đang làm với JSON đó, bạn chỉ cần xóa các thuộc tính bạn không muốn từ bộ nối tiếp của mình.

Ví dụ:

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

Tôi đoán rằng, trong trường hợp của bạn, bạn chỉ muốn làm điều đó.

Nhưng bạn cũng có khả năng để bao gồm một thuộc tính trên một điều kiện cụ thể:

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

    def include_author? 
    current_user.admin? 
    end 
end 

Và cuối cùng bạn có thể ghi đè lên các phương pháp thuộc tính để trả lại băm bạn cần:

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 

Xem README của ActiveModel::Serializers để biết thêm thông tin.

+1

Trình nối tiếp không hoạt động. Mã serializer mà tôi không có chứa các trường bí mật, nhưng đầu ra JSON vẫn làm. –

+0

Bạn có chắc là Rails đang chạy qua serializer không? Có lẽ bạn nên cố gắng để thả một binding.pry vào serializer đó để xem những gì sẽ xảy ra. Khác, cố gắng tải lên trên github hoặc ở một nơi khác một mẫu dự án của bạn với Gemfile tương ứng (.lock), tôi sẽ xem xét nó. – Simon

8

Tôi vừa gặp sự cố tương tự. Tôi đã không xác định chính xác lý do tại sao nhưng nó trông giống như respond_with trong Devessions's SessionsController (thử nghiệm trên Devise 3.0 và active_model_serializers 0.8.1) không kích hoạt ActiveModel::Serializer.

Vì vậy, tôi gạt respond_with trong bộ điều khiển của tôi:

class SessionsController < Devise::SessionsController 

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

end 

Đó là, tuy nhiên, làm việc tại RegistrationsController tôi với respond_with. Ở đó tôi cần phải làm như sau:

class RegistrationsController < Devise::RegistrationsController 

    respond_to :json 
end 
+0

Để tạo hai bộ điều khiển khách hàng, bạn đã làm gì? Ngoài ra, tệp routes.rb của bạn trông như thế nào? –

0

Chỉ cần đoán, nhưng có vẻ như đường ray không tìm thấy trình nối tiếp của bạn và đang sử dụng to_json(). Bạn đã xác định active_model_serializer() trong mô hình của mình chưa?

+0

Nếu serializer là UserSerializer và tên lớp là User nó sẽ được phát hiện tự động. – mattwindwer

2

Gần đây tôi đã chạy vào phần này và ghi đè respond_with không khắc phục được sự cố. Tôi đã kết thúc trọng to_json trong user.rb như vậy:

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

Không chắc chắn về arg thêm là, nhưng điều đó dường như được yêu cầu của một trong những mixins devise.

Tôi đang sử dụng như sau:

  • Rails 4.2.0
  • lập mưu 3.4.1
0

Tôi chỉ có cùng một vấn đề, dưới đây là cách tôi giải quyết nó, rất đơn giản .

Tất cả các thông qua trong active_model_serializers (0.9.5)

Override phương pháp đăng ký lập mưu, và trong hành động tùy chỉnh của bạn:

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

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

Nếu bạn muốn vượt qua một số thông số để Serializer tùy chỉnh của bạn (token chẳng hạn), bạn có thể vượt qua nó trong hành động của bạn:

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

Và trong serializer của bạn, chỉ cần sử dụng:

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

    def auth_token 
    serialization_options[:auth_token] 
    end 
end