2011-09-06 23 views
9

Tôi đã gặp một sự kỳ quặc mà tôi không thể giải thích liên quan đến Rails 3 và hiển thị partials với bố cục (từ bộ điều khiển). Tôi hy vọng ai đó có thể cung cấp một chút thông tin chi tiết về những gì đang xảy ra.Rails 3 vs 2.3.5 hiển thị các số lẻ với: một phần và: bố cục

Trước hết, chúng tôi sẽ gọi bộ điều khiển này là bộ điều khiển "kế thừa". Nó đã được khoảng một thời gian dài và đang làm rất nhiều điều sai trái, nhưng tôi không tìm cách tái cấu trúc nó vào thời điểm này vì vậy tôi đang cố gắng tìm cách để làm việc với những gì chúng tôi có.

Hành động new là một cái gì đó như thế này (trong BarsController)

def new 
    if something 
    render :partial => "foo", :layout => "bars" 
    elsif something_else 
    render :partial => "foo2", :layout => "bars" 
    elsif something_else_else 
    render :partial => "foo3", :layout => "bars" 
    else 
    render :partial => "foo4", :layout => "bars" 
end 

Bây giờ, trong Rails 2.3.5, điều này làm việc tốt. Nó sẽ làm cho phần thích hợp bên trong bố trí thích hợp - tôi nhận ra rằng tùy chọn bố trí là dư thừa ở đây vì nó sẽ mặc định bố trí thanh bất kể. Khi chúng tôi nâng cấp lên Rails 3.0.x, chúng tôi bắt đầu nhận được lỗi như sau:

Missing partial layouts/bars with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html] 

Rõ ràng file layouts/bars.html.erb là và luôn luôn ở đó, vì vậy tôi không thể hình dung nó ra. Tôi đã có thể render với :layout => false, nhưng tất nhiên điều đó sẽ không hoạt động. Cuối cùng tôi đã tìm ra rằng nếu tôi làm một trong hai điều sau đây, nó hoạt động:

1) Đổi tên bố trí của tôi để _bars.html.erb thay vì bars.html.erb và:

render :partial => 'foo2', :layout => 'bars'

2) Giữ cho bố cục của tôi như bars.html.erb (những gì tôi muốn) và:

render '_foo2' # :partial option is redundant here anyway


Có vẻ như là bằng cách sử dụng tùy chọn: partial thay vì chuỗi như tham số đầu tiên là làm cho đường ray áp dụng quy ước _name.html.erb cho cả partiallayout. Nếu tôi đặt dấu gạch dưới của riêng tôi, nó rơi trở lại hành vi tôi mong đợi mà không phải là thêm một mặt trước _ của tên bố trí.

Có ai biết tại sao trường hợp này xảy ra không?


EDIT Alright, không chắc chắn làm thế nào tôi bỏ lỡ này ... nhưng đây là một cái gì đó trong các tài liệu làm đề cập đến điều này. Dường như nó đã được khoảng từ 2.3.8, có lẽ nó đã được thực hiện một cách khác nhau trong 2.3.5 (những gì chúng tôi đã chạy trên)?

3.4.3 Layouts phần

Một phần có thể sử dụng tập tin bố trí riêng của mình, giống như một cái nhìn có thể sử dụng một cách bố trí . Ví dụ, bạn có thể gọi một phần như thế này:

<% = render "link_area",: Bố cục => "graybar" %> Điều này sẽ tìm kiếm một _link_area.html.erb tên từng phần và làm cho nó bằng cách sử dụng bố cục _graybar.html.erb.Lưu ý rằng bố cục cho partials theo cùng một tên hàng đầu dưới gạch dưới dạng partials thông thường và được đặt trong thư mục giống với một phần mà chúng thuộc về (không nằm trong thư mục bố cục chính ).


+0

Điều này sẽ yêu cầu nhiều mã mod hơn nếu bạn chuyển tham số cho partials, qua: đối tượng hoặc: người dân địa phương vì những thứ đó không hoạt động với mẫu. Tôi ước họ đã không thay đổi hành vi ... – farhadf

Trả lời

15

Dưới đây là câu trả lời của riêng tôi cho câu hỏi dựa trên những gì tôi đã chỉnh sửa trên:

Kể từ Rails 2.3.8, nó sẽ xuất hiện như là mặc dù hành vi mặc định khi vẽ một phần với render :partial => 'foo', :layout => 'bars' là để mong đợi tệp "bố cục một phần" cũng như tệp xem một phần. Trong trường hợp này thì sẽ khiến các

app/views/_foo.html.erb cũng như app/views/layouts/_bars.html.erb

Đối với bất cứ ai gặp phải vấn đề này nâng cấp từ Rails 2.3.5, đây là giải pháp tôi tìm thấy có số tiền ít nhất của tác động:

render '_foo', :layout => 'bars'

Giải pháp này không cho rằng bạn đang hiển thị một phần và do đó không mong đợi bố cục một phần. Các tùy chọn khác sẽ được lặp lại bố trí của bạn để

app/views/layouts/_bars.html.erb

và sử dụng

render :partial => 'foo', :layouts => 'bars'

nhưng mà kết quả trong một số trùng lặp mã.

RAILS 2.3.8+ DOC về vấn đề này:

3.4.3 Layouts phần

Một phần có thể sử dụng tập tin bố trí riêng của mình, giống như một cái nhìn có thể sử dụng một cách bố trí . Ví dụ, bạn có thể gọi một phần như thế này:

<% = render "link_area",: Bố cục => "graybar" %> Điều này sẽ tìm kiếm một _link_area.html.erb tên từng phần và làm cho nó bằng cách sử dụng bố cục _graybar.html.erb. Lưu ý rằng bố cục cho partials theo cùng một tên hàng đầu dưới gạch dưới dạng partials thông thường và được đặt trong thư mục giống với một phần mà chúng thuộc về (không nằm trong thư mục bố cục chính ).

+0

rất hữu ích, cảm ơn bạn đã chia sẻ! – Rubytastic

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