2010-04-30 37 views
20

Tôi đang sử dụng phương thức to_json trên một đối tượng và cố gắng lấy đối số :methods để hoạt động. Tôi có một phương pháp trên mô hình của tôi (Drop) được gọi là is_favorited_by_user?. Phương thức này lấy một đối số của current_user và sau đó kiểm tra xem liệu mức giảm có được người dùng ưa thích hay không. Làm thế nào tôi có thể vượt qua đối số này thông qua phương pháp to_json.Ruby to_json: các đối số phương thức

render :json => @drops.to_json(:methods => :is_favorited_by_user?(current_user)) 

Trả lời

36

Bạn có thể thêm current_user thuộc tính để mô hình của bạn và đặt nó trước khi thực hiện to_json

attr_accessor :current_user 

    def is_favorited_by_user?(user=nil) 
    user ||= current_user 
    # rest of your code 
    end 


@drops.current_user = current_user 
render :json => @drops.to_json(:methods => :is_favorited_by_user?) 
+0

Điều đó đã hiệu quả! Cảm ơn, Voyta! –

+4

Làm cách nào để mở rộng giải pháp này khi tôi thực hiện render: json => Drop.all trong hành động chỉ mục. Tôi chỉ định current_user ở đâu? –

+3

'cattr_accessor: current_user' trong mô hình và sau đó là' Model.current_user = current_user' trong bộ điều khiển. –

4

Phương pháp to_json không có ý định là đối tượng tham gia, mà chỉ là phương thức "getter". (Điển hình là những người tạo ra dựa trên thuộc tính db của bạn.)

Xem ví dụ ở đây, không ai vượt qua đối số:

http://apidock.com/rails/ActiveRecord/Serialization/to_json

Nếu bạn muốn làm điều gì đó tùy chỉnh, bạn sẽ cần phải tạo ra một phương pháp mà xây dựng băm thông tin bạn muốn, sau đó chuyển đổi băm đó thành json.

+1

Có cách nào mà tôi có thể nhận được các biến CURRENT_USER trong mẫu của tôi, vì vậy tôi không cần phải vượt qua đối số? –

+0

Mô hình @JamesFinley không (và không nên) nhận thức được trạng thái của bộ điều khiển hoặc yêu cầu http. current_user là một phần của yêu cầu và không nên tiếp xúc với các mô hình một cách toàn cầu do vấn đề đa luồng được nêu ở trên. Nó chỉ nên được truyền như một tham số của phương thức. – hammady

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