2009-11-04 33 views
12

Tôi có trang web Rails 2.1.2 chỉ có mẫu html, ví dụ: jobs.html.erb, vì vậy khi tôi yêu cầu một nguồn tài nguyên yên tĩnh:Các phương pháp để giới hạn định dạng hiển thị Đường dẫn thành html

www.mysite.com/jobs/1

Nó làm cho công việc của tôi trong html, tuy nhiên, nếu tôi yêu cầu:

www.mysite.com/jobs/1.xml

tôi nhận được lỗi:

Template is missing Missing template jobs/show.xml.erb in view path c:/workspace/mysite/app/views

Điều tồi tệ hơn là tôi cũng có thể yêu cầu một cái gì đó như

www.mysite.com/jobs/1.xyz

.210

Và quả thực tôi thấy lỗi:

Template is missing Missing template jobs/show.xyz.erb in view path c:/workspace/mysite/app/views

Để hiện stricly nội dung chỉ html, cách sạch nhất và đơn giản nhất để nói với Rails mà tôi không muốn làm bất cứ điều gì khác hơn là các file .html.erb là gì.

Điều quan trọng cần lưu ý là:

  • Một số hành động điều khiển của tôi chứa các cuộc gọi có điều kiện cho phương thức render() trong khi những người khác sử dụng các hành vi Rails mặc định tức là nếu bạn không gọi render() thì mẫu có tên youraction.html.erb sẽ được hiển thị.
  • Mã của tôi không sử dụng phương pháp responds_to()

Nó sẽ là tuyệt vời nếu các giải pháp đã không được ở render tốt nghiệp/Thực responds_to như tôi sẽ phải thay đổi một số lượng đáng kể của các hành động. Có lẽ có một cách để cấu hình Rails để chỉ html mẫu được trả lại?

Trả lời

7

Nếu bạn không muốn sử dụng responds_to, bạn có thể làm điều này:

class ApplicationController < ActionController::Base 
    before_filter :allow_only_html_requests 

    ... 

    def allow_only_html_requests 
    if params[:format] && params[:format] != "html" 
     render :file => "#{RAILS_ROOT}/public/404.html" 
    end 
    end 

    ... 

end 

Đó sẽ chạy trước khi tất cả các yêu cầu và chỉ cho phép những người không chỉ định định dạng ở tất cả, hoặc chỉ định định dạng html qua . Tất cả những người khác nhận được 404'd. Bạn có thể tạo công khai/406.html nếu bạn muốn trả lại 406 không được chấp nhận.

+1

Điều đó không thực sự trả về 404, mặc dù nó chỉ hiển thị '404.html' làm phản hồi 200. Bạn sẽ cần phải thêm ': status => 404' (hoặc': status =>: not_found'). Tương tự, đối với 406, bạn sẽ muốn sử dụng ': status => 406' (hoặc': status =>: not_acceptable'). – Peeja

+1

Điều này cũng không thành công nếu yêu cầu sử dụng tiêu đề 'chấp nhận' để yêu cầu loại phản hồi, vì nó không được lưu trữ trong các tham số – zimkies

14

Trong các tuyến đường của bạn, bạn có thể dễ dàng loại bỏ các dòng:

map.connect ':controller/:action/:id.:format' 

Và ".xyz" sẽ không còn được chuyển, dẫn đến 404 lỗi /.

+0

Xóa dòng này không giải quyết được sự cố trong Rails 3.2.6: đã được nhận xét nhưng lỗi Thiếu mẫu vẫn xuất hiện. – collimarco

5

Giải pháp của Ben hoạt động.

Hãy xem xét giải pháp responds_to. Nó sạch hơn vì nó cho phép sự linh hoạt khi bạn chắc chắn sẽ cần phải mở một hành động cho một cuộc gọi json hoặc xml JavaScript. Sau đó, bạn sẽ không phải thêm

skip_before_filter :allow_only_html_requests, :only => [:show] 

Cá nhân tôi thích khối respond_to; nó rất mô tả.

respond_to do |wants| 
    wants.html 
end 

Bất kỳ định dạng không được chỉ rõ trong khối sẽ tự động gây ra một HTTP 406 Không được chấp nhận để được trả lại. Thật tuyệt.

+1

Đồng ý. Khối responds_to mở ra một thế giới linh hoạt, và nếu bạn có thể dành thời gian để thêm một cho .html cho mỗi hành động điều khiển của bạn, đó là một giải pháp tư duy chuyển tiếp nhiều hơn. – Ben

10

Bạn có thể sử dụng tính năng Rails Per-Action Overwrite. Đây là gì? -> Nó cũng có thể ghi đè lên xử lý tài nguyên tiêu chuẩn bằng cách đi qua trong một khối để respond_with đó nêu rõ định dạng để ghi đè lên cho hành động đó:

class UsersController < ApplicationController::Base 

    respond_to :html, :xml, :json 

    # Override html format since we want to redirect to a different page, 
    # not just serve back the new resource 
    def create 
    @user = User.create(params[:user]) 
    respond_with(@user) do |format| 
     format.html { redirect_to users_path } 
    end 
    end 
end 

: trừ Và: Chỉ

Bạn cũng có thể vượt qua trong: trừ và: chỉ tùy chọn để chỉ định dạng hỗ trợ cho các hành động cụ thể (như bạn làm với before_filter):

class UsersController < ApplicationController::Base 
    respond_to :html, :only => :index 
    respond_to :xml, :json, :except => :show 
    ... 
end 

Các: bất kỳ định dạng

Nếu bạn vẫn muốn sử dụng respond_to trong hành động cá nhân của bạn, sử dụng: bất kỳ định dạng tài nguyên có thể được sử dụng như là một trận đấu wildcard chống lại bất kỳ định dạng không xác định:

class UsersController < ApplicationController::Base 

    def index 

    @users = User.all 

    respond_to do |format| 
     format.html 
     format.any(:xml, :json) { render request.format.to_sym => @users } 
    end 
    end 
end 
+1

Đây chỉ là Rails 3. – Jared

+0

Jared, bạn có thể vui lòng cụ thể hơn trong ba lựa chọn là Rails 3 chỉ! Tôi đang chạy trên Rails 2.3.4 và: bất kỳ Option nào hoạt động. – leviathan

1

tôi đã nhận được không sensical yêu cầu định dạng hình ảnh trên các tệp HTML, kích hoạt 500 với MissingTemplate. Tôi đã vi phạm những điều sau vào cuối hành động của tôi:

def show 
    # [...] 
    respond_to :html 
end 

Và bây giờ thay vì nhận được báo cáo lỗi, chúng tôi phát ra 406 người yêu cầu không phù hợp.

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