2012-11-24 3 views
0

У меня есть приложение Rails, в котором я поместиться весь свой веб-сайт в 980width контейнер со следующим кодом в моем файле «application.html.erb»:Rails: Правильный способ сделать исключение «Доход» с помощью «Content_for»?

<div class="container_980 white shadow-horizontal"> 
     <div class="container"> 
     <%= render 'layouts/flashes' %> 
     <%= yield %> 
     </div> 
    </div> 

Теперь я хочу сделать исключение 2 файла для подгонки содержимого в контейнере. Я хочу, чтобы страница индекса и другая страница расширялись по всей странице, поэтому мне нужно получить эти две страницы за пределами общей «доходности», установленной выше.

Я пытался сделать это с:

<% if current_page?(root_url) %> 
    <%= yield :index %> 
    <% elsif current_page?(:controller => "tracks", :action => "show", :id => params[:id])) %> 
    <%= yield :show_track %> 
    <% else %> 
    <div class="container_980 white shadow-horizontal"> 
     <div class="container"> 
     <%= render 'layouts/flashes' %> 
     <%= yield %> 
     </div> 
    </div> 

и

<% content_for :show_track do %> 
    blah blah blah 
<% do %> 

ПРОБЛЕМА: страница show_track не загружается. Я сделал некоторые поиски, и кажется, что вышеупомянутый метод должен работать, но это не так, и мне было интересно, нужно ли мне что-то делать, поскольку страница «показать» была сделана с помощью scaffoldaing (RESTful).

Есть ли лучший способ вынуть 2 страницы из контейнера, чем использовать, если ...?

+0

Вы пытались использовать ' content_for (: show_track) 'вместо' yield'? – doesterr

ответ

2

Есть ли лучший способ вытащить 2 страницы из контейнера, чем использовать, если ...?

Это субъективно, но я бы использовал вложенные макеты, а затем определял макеты для каждого типа страницы в контроллере.

Сначала ваш основной макет верхнего уровня. Я называю это «приложение», значение по умолчанию, но вы можете назвать это как угодно. Обратите внимание, что если есть content_for? :application, он уступит его, иначе он просто уступит. Это ключ к настройке. Все вложенные макеты должны соответствовать аналогичной схеме; таким образом, они могут отображать дополнительные вложенные дочерние макеты или сами использоваться как макеты.

<!-- layouts/application.html.erb --> 
<html> 
    <body> 
    <%= content_for?(:application) ? yield(:application) : yield %> 
    </body> 
</html> 

Тогда для контейнера, вы бы определить макет, который может быть вложен внутри «приложения», этот параметр ваш контейнер HTML и визуализации содержимого внутри.

<!-- layouts/container.html.erb --> 
<%= content_for :application do %> 
    <div class="container_980 white shadow-horizontal"> 
    <div class="container"> 
     <%= render 'layouts/flashes' %> 
     <%= content_for?(:container) ? yield(:container) : yield %> 
    </div> 
    </div> 
<% end %> 

<%= render :file => "layouts/application" %> 

Тогда просто переместить условную логику в контроллер, как:

layout :determine_layout 

protected 

function determine_layout 
    # pseudocode here, you get it 
    (index or tracks) ? "application" : "container" 
end 

Вы могли бы там остановиться. Продолжайте следить за тем, как вы можете развернуть макеты.

Однако вы можете пойти дальше и использовать установку вложенного макета, чтобы вставить произвольные числа различных макетов. Скажем, например, что треки имеют другой блок содержимого, который вам нужно заполнить. Вы можете определить другую вложенную компоновку, как:

<!-- layouts/tracks.html.erb --> 
<%= content_for :some_other_block do %> 
    // stuff that should be in some other block 
<% end %> 

<%= content_for :container do %> 
    // stuff that should be in the container 
<% end %> 

<%= render :file => "layouts/container" %> 

Тогда в контроллере, вы бы изменить свой determine_layout, чтобы установить «дорожки» макет для дорожек, например:

function determine_layout 
    # pseudocode here, you get it 
    if index 
    "application" 
    elsif tracks 
    "tracks" 
    else 
    "container" 
    end 
end 
+0

Благодарим вас за ответ!Думаю, я понимаю ваше решение концептуально, но у меня есть пара вопросов. (1) почему вы делаете родительский файл внизу? (2) можете ли вы немного рассказать о части контроллера? Я новичок и немного запутался, на каком контроллере мне нужно ввести код, и что именно мне нужно ввести .. :( – kibaekr

+0

, а также, если я решаю использовать условия if..else, как: <% elsif current_page? (: controller => 'tracks',: action => 'show')%> не работает? Это неправильный синтаксис, чтобы проверить, является ли текущая страница отображаемой страницей RESTful scaffolded страница? – kibaekr

+0

1.) Вы визуализируете родительский файл внизу, потому что вам нужно сначала определить содержимое для блока, чтобы оно было доступно, когда визуализируется родительский макет. 2.) Ознакомьтесь с документами [здесь] (http://api.rubyonrails.org/classes/AbstractController/Layouts.html) и [здесь] (http://api.rubyonrails.org/classes/AbstractController/Layouts/ ClassMethods.html). Один из способов указать макет шаблона - через функцию. Там задокументировано. Если вашим контроллерам нужен только один макет, вам даже этого не понадобится. Вы могли бы просто сказать «макет» контейнера »и т. Д. – numbers1311407

Смежные вопросы