2008-10-21 27 views
11

Tôi có mô hình ActiveRecord mà tôi muốn chuyển đổi thành xml, nhưng tôi không muốn tất cả các thuộc tính được hiển thị trong xml. Có một tham số tôi có thể vượt qua vào phương thức render để giữ cho một thuộc tính không được hiển thị trong xml không?Loại trừ một số thuộc tính ActiveRecord khỏi hiển thị xml trong đường ray

Dưới đây là ví dụ về những gì tôi đang nói đến.

def show 
    @person = Person.find(params[:id]) 
    respond_to do |format| 
    format.xml { render :xml => @person } 
    end 
end 

tạo xml sau

 
<person> 
    <name>Paul</name> 
    <age>25</age> 
    <phone>555.555.5555</phone> 
</person> 

Tuy nhiên, tôi không muốn sở hữu điện thoại được hiển thị. Có một số tham số trong phương thức kết xuất không bao gồm các thuộc tính được hiển thị trong xml không? Loại giống như ví dụ sau

def show 
    @person = Person.find(params[:id]) 
    respond_to do |format| 
    format.xml { render :xml => @person, :exclude_attribute => :phone } 
    end 
end 

mà sẽ làm cho xml sau

 
<person> 
    <name>Paul</name> 
    <age>25</age> 
</person> 

Trả lời

14

Bạn có thể vượt qua một loạt các mô hình tên gán cho các tùy chọn :only:except, ví dụ như vậy của bạn nó sẽ là:

def show 
    @person = Person.find(params[:id]) 
    respond_to do |format| 
    format.xml { render :text => @person.to_xml, :except => [:phone] } 
    end 
end 
2

"render: xml" không hoạt động, nhưng to_xml đã hoạt động. Dưới đây là một ví dụ

def show 
    @person = Person.find(params[:id]) 
    respond_to do |format| 
    format.xml { render :text => @person.to_xml(:except => [:phone]) } 
    end 
end 
7

Tôi chỉ đã tự hỏi điều này đó, tôi thực hiện thay đổi ở cấp mô hình vì vậy tôi sẽ không cần phải làm điều đó trong bộ điều khiển, chỉ là một lựa chọn nếu bạn quan tâm.

mô hình

class Person < ActiveRecord::Base 
def to_xml 
    super(:except => [:phone]) 
end 
def to_json 
    super(:except => [:phone]) 
end 
end 

khiển

class PeopleController < ApplicationController 
    # GET /people 
    # GET /people.xml 
    def index 
    @people = Person.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @people } 
     format.json { render :json => @people } 
    end 
    end 
end 

tôi đặt một trong số họ lên cho json và xml trên tất cả các đối tượng, kinda thuận tiện khi tôi muốn lọc thứ ra khỏi tất cả các lựa chọn phản hồi được định dạng. Điều thú vị về phương pháp này là ngay cả khi bạn lấy lại bộ sưu tập, nó sẽ gọi phương thức này và trả về kết quả đã lọc.

1

Ngoại trừ là tốt, nhưng bạn phải nhớ đặt nó ở mọi nơi. Nếu bạn đang đặt điều này trong một bộ điều khiển, mọi phương thức cần phải có một mệnh đề ngoại trừ. Tôi ghi đè lên phương thức serializable_hash trong các mô hình của tôi để loại trừ những gì tôi không muốn hiển thị. Điều này có lợi ích của việc không đặt nó ở mọi nơi bạn sẽ quay trở lại cũng như áp dụng cho các phản hồi JSON.

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