2014-10-07 25 views
0

通常推薦的解決方案是在父佈局文件中的content_for。但是這會導致必須在每個視圖中指定它,因爲如果內容不在子視圖部分中,默認設置就不會顯示它。例如,如果我有一個我想隱藏在認證頁面中的邊欄,但在其他地方都有,那麼現在我必須在除認證頁面以外的每個視圖文件中指定邊欄的內容。不幹。更加乾淨的方式顯示/隱藏軌道中的部分/模板

這比以前更麻煩,也不幹燥,我可以在佈局中渲染一個側欄,並用它來完成(但沒有選擇它在哪裏或不在哪裏渲染的好處)。

如果您可以以某種方式在佈局模板中指定如果它是會話控制器或設計控制器而調用側欄部分不投標,那將會很好。

有沒有辦法做到這一點?我試過使用

unless devise_controller? 
    render "layouts/sidebar" 

但是,這似乎沒有按預期工作。


以與制定一個例子,我有像這樣

.row 
    main 
    .col-sm-9 
     = yield 
    - unless devise_controller? 
     .col-sm-3 
     == render 'layouts/sidebar' 

忽略列的一刻,application.html.slim文件。重點是=yield呈現正常的模板以及設計模板。所以我不能在一次DRY中風中選擇性地禁用邊欄。我必須在每個視圖文件中放置邊欄呈現調用,但不要將其包含在我的設計視圖中。這並不比在每個非設計視圖文件中使用content_for更好或DRYer。

回到列,我想有12列,而不是9列產生的設計意見。但這只是獎金,而不是主要問題。

+1

你可以有權威性的網頁,你會不會使側邊欄,無特別的佈局? – 2014-10-07 13:32:32

+0

如果你指的是設計視圖文件,我認爲不是。我在application.html文件中有一個'= yield',它呈現了設計視圖模板。所以設計意見受其父母的造型影響。讓我在OP中增加一些代碼。 – ahnbizcad 2014-10-07 13:35:47

+0

你能爲我提供一些具體細節嗎? @Sergio Tulentsev?我不知道它是哪個文件,或者你有什麼樣的設計模式。 – ahnbizcad 2014-10-07 13:41:26

回答

1

我簡單地實現做事情的詳細方法。我會用一個複雜的例子,因爲它可能更有幫助。

在這裏,我建立了完整的案例,這取決於我是否需要一個側邊欄,主要是因爲引導列和行的工作方式。如果您使用引導程序,您會注意到,一旦您阻止了側邊欄渲染,您將留下剩餘的主要內容,而不會佔用側欄不再需要的空間。這是因爲您之前必須將側邊欄和主要內容放在特定的列寬中,並將其放在一行中(以便它們並排顯示)。由於您希望主內容填充並在邊欄消失時取得全寬,所以在這種情況下,必須應用完全不同的列寬。因此完整的if - else語句。

因此,像這樣實施它,確保在您的每個主要視圖文件中包含.rows.col-*-*

申請。HTML

- if hide_sidebar? 
    main 
     = yield 
    - else 
    .row 
     .col-xs-12.col-sm-9 
     main 
      = yield 
     .col-xs-12.col-sm-3 
     == render 'layouts/sidebar' 

如果頁面的列表中,您希望有或沒有側邊欄變得比單純所有一定的控制器的動作比較複雜,實現獨立的輔助方法,指定所有的條件。

這是控制器中的一種方法。在我的示例中,我想在註冊控制器和用戶控制器的顯示操作時隱藏邊欄。我只是||每個在助手的方法。

application_helper.rb

def want_sidebar? 
    (controller_name == 'registrations') || ((controller_name == 'users') && action_name == 'show') 
end 
1

如果堅持檢查控制器的名稱,你可以這樣做:

<% if controller.controller_name == 'devise' %> 
... 
<% else %> 
    <%= render 'sidebar' %> 
<% end %> 
+0

我只堅持有一個乾燥的'if'條件。看起來比做設計佈局更直接一點。也許我高估了複雜性。 – ahnbizcad 2014-10-07 14:01:04

+0

該代碼不適合我。它必須是'devise_controller?'不能正常工作的原因。 – ahnbizcad 2014-10-07 14:43:03

+1

您可能需要調整=='設計部分'。您是否嘗試過輸出控制器名稱,例如<%= controller.controller_name%>並檢查。另外,它可能是註冊控制器。玩一下它。 – 2014-10-07 14:57:41