2011-01-26 24 views
34

Với định tuyến mặc định, yêu cầu/bài đăng /: id được ánh xạ tới hành động "hiển thị" với :format => "html". Tôi đang sử dụng một số phần tử xhtml trong hành động hiển thị của tôi mà không được hiển thị chính xác trừ khi: content_type được đặt thành xml. Tôi hiện đang nhận được thông tin này bằng cách hiển thị tệp show.xml.erb và đặt content_type theo cách thủ công như sau:Cách đặt định dạng mặc định cho tuyến đường trong Rails?

format.html { render :template => "/posts/show.xml.erb", 
      :locals => {:post => @post}, :content_type => "text/xml" } 

Điều này có vẻ ngớ ngẩn. Làm cách nào để thay đổi routes.rb để/bài đăng /: id được định tuyến với format=>"xml"? Cảm ơn.

+0

câu hỏi của bạn gây nhầm lẫn về mô hình: bạn có lô hoặc bài đăng không? – tomeduarte

+0

oops, xin lỗi. một mô hình của nó, gọi nó là bài viết. – Saucerful

Trả lời

76

Mặc định dạng cho các yêu cầu:

Bạn có thể đặt định dạng mặc định của một tuyến đường cụ thể cho xml bằng cách sử dụng giá trị mặc định băm.

Ví dụ:

# single match defaulting to XML (/plots/1 is the same as /plots/1.xml) 
match 'posts/:id' => 'posts#show', :defaults => { :format => 'xml' } 

# using resources, defaulting to XML (all action use XML by default) 
resources :posts, :defaults => { :format => 'xml' } 

# using resources and mixing with other options 
resources :posts, 
      :only => [:new, :create, :destroy], 
      :defaults => { :format => 'xml' } 

Nó luôn luôn là một ý tưởng tốt để tìm kiếm trên official Ruby on Rails routing guide, nó khá sâu và một nguồn tài nguyên đầu tiên ngừng rất tốt cho bất kỳ vấn đề định tuyến.

+9

Bạn cũng có thể đặt định dạng mặc định cho không gian tên và như vậy: 'không gian tên: người dùng,: mặc định => {: format => 'json'}' –

+0

Tuyệt vời. Nếu không có định dạng thiết lập như trên, tôi đã nhận được 406 lỗi yêu cầu xml mặc dù mọi thứ khác đã được mát mẻ trong bộ điều khiển. – Polsonby

19

Nếu bạn chỉ muốn hỗ trợ một định dạng và xử lý tất cả các yêu cầu như là định dạng đó, bạn có thể sử dụng một bộ lọc để thay đổi nó:

before_filter :set_format 

def set_format 
    request.format = 'xml' 
end 
+0

Mã này có nằm trong Bộ điều khiển không? – Saucerful

+1

Có. Nếu bạn chọn sử dụng giải pháp này thay vì cách đường (xem câu trả lời của tôi), bạn nên đặt bộ lọc làm phương thức riêng tư, cho mỗi mối quan ngại về bảo mật. - lưu ý rằng điều này buộc định dạng là nơi mà các tuyến đường không, chỉ cần đặt mặc định. – tomeduarte

6

Rails 5: Trong điều khiển của bạn (ví dụ ApplicationController nếu tất cả toàn bộ ứng dụng sử dụng cùng định dạng) thêm sau:

before_action :set_default_request_format 

    def set_default_request_format 
    request.format = :json unless params[:format] 
    end 

Đối Rails 4 tuổi trở lên sử dụng before_filter thay vì before_action.

2

Tôi thấy hành vi kỳ lạ trong Rails 5 nếu bạn sử dụng này:

{ format: :json } 

Trong config/routes.rb của bạn sau đó ngay cả khi JSON không được thiết lập trong chấp nhận tiêu đề của bạn, nó vẫn cưỡng ép yêu cầu đến một yêu cầu JSON , bao gồm kiểm tra bộ điều khiển có bộ tùy chọn as: :html. Nó không thực sự là một vấn đề lớn đối với tôi, vì vậy tôi sẽ không đào sâu vào lý do tại sao điều này, nhưng nếu ai đó hình dung ra, hãy cho tôi biết và tôi sẽ cập nhật câu trả lời này.

+0

Tôi cũng thấy điều này. Khá khó chịu. – turboladen

0

Nếu bạn muốn thiết lập định dạng mặc định cho một lộ trình, sử dụng defaults tùy chọn:

resources :posts, defaults: { format: 'xml' } 

Nhưng nếu bạn muốn thực thi mọi yêu cầu quay trở lại một định dạng cụ thể, sử dụng constraints tùy chọn:

resources :posts, constraints: lambda { |req| req.format = 'xml' } 

Xem tài liệu: http://edgeguides.rubyonrails.org/routing.html#request-based-constraints

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