2010-03-04 35 views
31

Tôi không chắc liệu mình có đang làm cách tiếp cận tốt nhất ở đây không, nhưng tôi có một khối dữ liệu mà tôi muốn hiển thị sau khi tìm kiếm xong và không có ở đó trước. Trước hết, không có gì để hiển thị, và thứ hai mô hình nó tham chiếu là không vì vậy nó ném một ngoại lệ.Ruby on Rails: có điều kiện hiển thị một phần

Tôi đã đặt khối này vào một phần mẫu và thêm nó vào vị trí thích hợp trong bố cục của tôi. Có cách nào để làm sạch hoàn toàn một phần có điều kiện không? Có cách nào tốt hơn để tiếp cận vấn đề này không?

Trả lời

41

của Ruby cho phép bạn làm những điều tốt đẹp như thế này:

<%= render :partial => "foo/bar" if @conditions %> 

Để làm điều này một chút dễ dàng hơn để đọc và hiểu, nó có thể được viết như sau:

<%= render(:partial => "foo/bar") if @conditions %> 

render là một chức năng, và bạn chuyển nó thành một băm cho biết phần nào cần trả về. Ruby cho phép bạn đặt mọi thứ trên một dòng (thường làm cho chúng dễ đọc hơn và súc tích hơn, đặc biệt là trong các khung nhìn), do đó, phần if @conditions chỉ là một câu lệnh if bình thường. Nó cũng có thể được thực hiện như:

<% if @conditions %> 
    <%= render :partial => "foo/bar" %> 
<% end %> 

Edit:

Ruby cũng cho phép bạn sử dụng từ khóa unless ở vị trí của if. Điều này làm cho mã dễ đọc hơn và ngăn bạn không phải so sánh tiêu cực.

<%= render :partial => "foo/bar" if [email protected] %> 
#becomes 
<%= render :partial => "foo/bar" unless @conditions %> 
+0

'<% = render: partial =>" foo/bar "trừ khi @conditions%>' là sự phù hợp mà tôi đang tìm kiếm. Và, về bình luận của bạn dưới đây, tôi đồng ý rằng nó sẽ là ngu ngốc để được hoàn toàn dogmatic về việc tách các mối quan tâm. Đó thực sự là một lý do tôi thích Rails templating linh hoạt so với một hệ thống như Django có. Nhưng tôi thích giới hạn nó khi có thể. Cơn ác mộng hồi tưởng lại những ngày làm asp cổ điển của tôi, tôi đoán vậy. Cảm ơn đã giúp đỡ! –

+0

Không sao cả. Phần khó khăn khi chuyển từ một thứ như ASP là xác định nơi logic ứng dụng/kinh doanh của bạn kết thúc và nơi bắt đầu logic xem. –

5

Một cách dễ dàng là sử dụng phương pháp trợ giúp. Người trợ giúp có xu hướng sạch hơn một chút so với việc đặt logic trực tiếp trong chế độ xem.

Vì vậy, quan điểm của bạn có thể là một cái gì đó như:

<%= render_stuff_conditionally %> 

và helper của bạn sẽ có một phương pháp để kiểm soát này:

def render_stuff_conditionally 
    if @contional_check 
    render :partial => 'stuff' 
    end 
end 

nơi rõ ràng là điều được đặt tên thích hợp hơn

+0

Đồng ý, việc đặt logic vào trình trợ giúp là tốt nhất. – bojo

+1

Tôi không đồng ý. Có một sự khác biệt rõ rệt giữa logic điều khiển và logic xem, và đây là logic xem. Nó có thể được thực hiện như một lớp lót ngắn gọn như tôi đã gợi ý. Tùy chọn này chỉ làm cho khó tìm ra các điều kiện nào đang được kiểm tra khi gỡ lỗi hoặc duy trì mã. –

+2

Tôi nghĩ rằng nó đáng xem xét tình hình và những gì bạn đang thực sự đạt được từ việc sử dụng hoặc không sử dụng một người trợ giúp. Nếu mã bạn đang xem xét nhồi vào một người trợ giúp sẽ cải thiện khả năng đọc của khung nhìn, nó có thể đáng giá cho bạn. Nếu rời khỏi điều kiện (hoặc bất kỳ mã nào) bên trong khung nhìn, nó sẽ cho phép mã dễ đọc hơn và có thể duy trì được thì cũng cần xem xét. Những người trợ giúp có thể trở thành người nắm bắt tất cả các loại mã, trong trường hợp đó, mã xem của bạn có thể đẹp nhưng bạn chỉ "vắt bóng" (và sự lộn xộn không biến mất). – Tass

1

Giả Tôi đang theo bạn đúng, bạn làm điều này ở cấp độ xem.

<% if [email protected]_search_data.nil? %> 
<% render :partial => 'foo/bar' %> 
<% end %> 

Hy vọng điều đó sẽ hữu ích. Nếu không, có thể đăng một ví dụ về mã của bạn.

+1

Đó thực sự là những gì tôi đã làm trong khi chờ đợi phản hồi. Nó hoạt động, nhưng tôi thích tránh logic có điều kiện trong một khung nhìn nếu hợp lý có thể. –

+0

Giải pháp của Pete là cách tốt nhất để đi trong trường hợp đó. – bojo

+0

@Donald: Không có lý do gì để tránh xa logic trong lượt xem. Có một đường thẳng giữa "logic xem" và "logic ứng dụng". –

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