2009-08-25 27 views
27

Có thể có cách tốt hơn để làm điều này, nhưng tôi đang cố gắng thực hiện một tuyên bố if trong đường ray, dựa trên hành động hiện tại, trong bộ điều khiển (điều này sẽ được sử dụng trong chế độ xem).Rails có điều kiện ('if') báo cáo dựa trên hành động điều khiển

Ví dụ: nếu trang chỉnh sửa của trang hoặc trang hiển thị, v.v. Tôi muốn một kiểu khác cho một thứ gì đó - có một câu lệnh if có thể chỉ định điều này không?

(Tôi cần câu lệnh if, vì nó được sử dụng một phần, trên nhiều trang).

Cảm ơn!

Elliot

Trả lời

47

Các params băm có sẵn trong bộ điều khiển chứa :controller:action phím, trong đó quy định các điều khiển và hành động tên của các yêu cầu.

Vì vậy, bạn có thể nói

if params[:action] == "foo" 
    # Show stuff for action 'foo' 
elsif params[:action] == "bar" 
    # Show stuff for action 'bar' 
elsif ... 
    # etc. 
end 
+1

tạo ảnh vui nhộn nhờ !!!! – Elliot

+1

Rất cám ơn ... thư từ tương lai: D –

3

Bạn có thể làm theo cách này:

class ApplicationController < ActionController::Base 
    layout :set_layout 

    def set_layout 
    case params[:action] 
    when "foo" 
     "foo_layout" 
    when "bar" 
     "bar_layout" 
    ... 
    else 
     "default_layout" 
    end 
    end 

    ... 

end 

hy vọng nó sẽ giúp =)

+0

Điều đó chỉ hoạt động cho toàn bộ bố cục của trang, phải không? Thay vì một phần trong câu hỏi. – Shadwell

+0

tôi đã chỉnh sửa mã để ApplicationController. Trong trường hợp đó, kể từ khi các hành động được sử dụng trong các bộ điều khiển khác nhau, nó có ý nghĩa tốt hơn bây giờ =) – Staelen

+0

Nó vẫn chỉ đặt bố cục cho trang mặc dù phải không? – Shadwell

1

Bạn có thể sử dụng bố trí cho partials quá:

<%= render :partial => 'some_partial', :layout => 'wrap_with_stuff' %> 

Nếu bạn muốn t o làm việc ra những gì bố trí để sử dụng năng động, tôi muốn đặt rằng trong một người trợ giúp. Vì vậy, bạn muốn kết thúc với

# In your view 

<%= render :partial => 'some_partial', :layout => layout_for_my_partial %> 

# In your helper 

def layout_for_my_partial 
    params[:action] == 'show' ? 'show_wrapper' : 'everything_else_wrapper' 
end 

này chỉ hoạt động trong một số trường hợp, nhưng có thể là những gì bạn đang cố gắng làm.

Xem thêm tại đây.

http://ryandaigle.com/articles/2007/8/3/what-s-new-in-edge-rails-partials-get-layouts

18

Đó không phải là thực hành tốt IMO có partials hỏi những gì bộ điều khiển và hành động tên hiện nay. Hãy suy nghĩ "nói, đừng hỏi" (http://www.pragprog.com/articles/tell-dont-ask). Nghĩa là, thay vì yêu cầu một phần, đó là người gọi về trạng thái của nó, cho biết một phần những gì bạn muốn.

Một cách để làm điều này là bằng cách đi qua các biến đến từng phần qua các tùy chọn locals:

<%= render :partial => "/common/toolbar", :locals => {:edit => true} %> 

Sau đó, trong phần:

<% if defined?(edit) && edit %> 
... stuff appropriate to edit mode 
<% end %> 
Các vấn đề liên quan