Tắt bố cục cho một hành động


81

Tình huống của tôi: Hành động xem của ReportsController sẽ hiển thị html thuần túy, nhưng không phải dưới dạng tệp (để xem trong trình duyệt và lưu nó sau đó). Vì vậy, để kết xuất, tôi sử dụng chế độ xem mẫu view.html.erb và tôi cần tắt mọi bố cục cho hành động này. Nhưng trong các hành động khác của bộ điều khiển này, bố cục bộ điều khiển sẽ không bị ảnh hưởng. Chỉ hoạt động khi tắt toàn bộ bộ điều khiển như thế này:

ReportsController < ApplicationController
  layout false

Nhưng điều đó làm sai :( cho tất cả các hành động tôi đã cố gắng sử dụng một cái gì đó như thế này trong hành động:

def view      
  @report = Report.new(params[:report])
  unless @report.valid?
    render :action => 'new' and return
  else
    render :layout => false     
  end   
end

Tôi nên làm gì?


Chà, bạn chắc chắn không cần lợi nhuận rõ ràng đó. Bạn có muốn bố cục hiển thị nếu báo cáo hợp lệ không?
tfwright

Câu trả lời:


73

Thử đi:

ReportsController < ApplicationController
  layout false
  layout 'application', :except => :view

Có vẻ như chỉ thị này hoạt động sai (hoặc không mong muốn). Tôi đã cố gắng sử dụng một số kết hợp của các tham số này (: only,: exception). Nhưng nó hoạt động kỳ lạ khi loại bỏ tất cả các bố cục cho tất cả các hành động. Tôi nghĩ đó là do nil hoặc false thay vì 'tên bố cục'. Và hệ thống cố gắng sử dụng bố cục 'tên bộ điều khiển' cho tất cả các hành động khác bỏ qua bố cục ứng dụng. Hãy thử chơi với các thông số này và bạn sẽ hiểu tất cả những gì về điều này.
Antiarchitect

2
Bạn nói đúng, :onlykhông hoạt động đúng cách layout nil. Tuy nhiên, tôi đã có thể làm cho nó hoạt động bằng cách loại bỏ bố cục và thêm nó trở lại với ngoại lệ. Tôi đã cập nhật câu trả lời của mình.
mckeed

2
Câu trả lời của David Ortiz là "đúng hơn", vì nó cách ly đúng cách chuyển đổi bố cục sang hành động đơn lẻ được đề cập.
Frank Koehl

Tôi đồng ý với @Paul - falsehoạt động! Cảm ơn vì điều đó!
mrstif

layout false, only: :viewgiống như một cách ngắn gọn hơn để hoàn thành cùng một mục tiêu mà không có tác dụng phụ như Antiarchitect đã đề cập.
SMAG


11

Trong khối phản hồi, hãy thêm layout: false.

Ví dụ:

respond_to do |format|
  format.html { render :layout => false } # your-action.html.erb
end

2

Nếu bạn muốn nhận một mẫu không chuẩn, không có bố cục, bạn có thể sử dụng:

def non_rest
  render template: 'layouts/something_new', layout: false
end
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.