2011-03-04 21 views
10

Tôi đang sử dụng Ruby on Rails 3 và tôi muốn ghi đè (có thể trong tệp mô hình) phương thức as_json hoặc to_json để yêu cầu HTTP respond_to mà không bao gồm một số thông tin.Cách ghi đè phương thức 'as_json' hoặc 'to_json' để 'respond_to' mà không bao gồm thông tin được chỉ định?

Trong Tài khoản của tôi mô hình Tôi có

def as_json(options = {}) 
    super(
    :except => [ 
     :password 
    ] 
) 
end 

Trong điều khiển của tôi, tôi có

format.json { 
    render :json => @account, :status => 200 
} 

Khi tôi thực hiện một yêu cầu, ví dụ, để /account/1.json tôi có trở lại cũng là mật khẩu thuộc tính đó vì lý do an ninh, tôi không muốn.

Vì vậy, làm cách nào để ngăn chặn bao gồm thông tin được chỉ định?


tôi có thể làm điều này và nó hoạt động

format.json { 
    render :json => @account.to_json(:except => [:password]), :status => 200 
} 

nhưng nó tôi cần phải Refactor.

+0

các giải pháp sau đây của tôi đang làm việc cho tôi mà không cần tái cấu trúc. Họ không làm việc trong môi trường của bạn? – tommasop

Trả lời

12

Nếu nó chỉ là trong một hành động mà bạn có thể thử:

format.json { render :json => @account, :except => :password } 

nếu bạn cần nó cho nhiều hành động hơn so với ghi đè sẽ tốt hơn:

# Exclude password info from json output. 
def to_json(options={}) 
    options[:except] ||= :password 
    super 
end 

cùng là tốt cho as_json

# Exclude password info from json output. 
def as_json(options={}) 
    options[:except] ||= :password 
    super 
end 
+0

Để làm việc, tôi PHẢI sử dụng 'render: json => @ account.to_json' thay vì 'render: json => @account'. Tôi nghĩ rằng có một số cách để làm điều đó mà không bao gồm '.to_json' ... – user502052

+1

trong đường ray 3 nếu bạn ghi đè lên phương thức as_json trong mô hình và sau đó đặt format.json {render: json => @account} trong bộ điều khiển nó làm việc mà không gọi to_json – tommasop

+0

Đối với tôi, điều đó không hiệu quả. - Amico ;-) – user502052

0

Giải pháp tốt nhất là ghi đè as_json phương pháp trong mô hình của bạn như sau:

def as_json options={} 
    super(
    include: {ADD THE RELATIONS YOU WANT TO INCLUDE}).merge({YOU CAN MERGE EXTRA PARAMETER HERE}) 
end 

Bạn có thể sử dụng chỉ (có nghĩa là các thông số duy nhất mà bạn đã liệt kê sẽ trở về) hoặc sử dụng trừ (có nghĩa là trả lại tất cả các thông số trừ những người được liệt kê).

Các vấn đề liên quan