Эквивалент Asp.net MasterPage в Ruby on Rails, попытка определить общий макет сайта

Asp.net WebForms и MVC имеют концепцию мастер-страниц, которые упрощают определение одноразового макета для всей страницы вашего сайта. В Rails я изо всех сил пытаюсь найти эквивалентный шаблон использования или функцию.

Из того, что я прочитал, очень легко определить макет в каждом действии с помощью:

layout: 'viewname'

Теперь это казалось довольно церемониальным для включения в каждый контроллер, поэтому я добавил:

layout: 'application'

в базовом ApplicationController.

Пока это работает нормально, если у меня нет более конкретного макета на страницах просмотра. Является ли это общепринятым методом получения единообразного стиля в вашем приложении Rails?


person John Farrell    schedule 04.07.2010    source источник


Ответы (2)


Представьте упрощенный блог, в котором у нас есть контроллер PostsController с двумя действиями: index и show.

Действие index вызывается, когда пользователь нажимает http://yourwebsite.com/posts — это действие отображает все доступные сообщения в блоге.

Действие show вызывается, когда пользователь получает определенную статью в блоге, например http://yourwebsite.com/posts/article-about-something-interesting

Допустим, мы хотим, чтобы индексная страница имела макет из двух столбцов, а страница показа для каждой статьи в блоге имела макет из трех столбцов. Для этого мы просто определяем два отдельных макета (в папке app/views/layouts) — мы назовем макет с двумя столбцами «приложением», а макет с тремя столбцами — «альтернативным».

Чтобы страница индекса использовала макет с двумя столбцами, а страница показа — макет с тремя столбцами, мы могли бы просто сделать следующее в нашем контроллере:

class PostsController < ApplicationController
  def index
    @posts = Post.all
    render :layout => "application"
  end

  def show
    @post = Post.find(params[:id])
    render :layout => "alternate"
  end
end

Если мы хотим, чтобы все действия использовали один и тот же макет, мы можем просто сделать это:

class PostsController < ApplicationController
  layout "application"

  def index
    @posts = Post.all
  end

  def show
    @post = Post.find(params[:id])
  end
end

Наконец, если мы не укажем, какой макет мы хотим использовать, то Rails по умолчанию будет отображать любой макет, имеющий то же имя, что и отображаемый ресурс. Итак, в нашем примере, где наши ресурсы называются «Сообщения», если мы определим третий макет с именем posts.html.erb (в app/views/layouts), то Rails будет автоматически использовать этот макет, когда пользователь выполняет любое из действий в PostsController - при условии, конечно, что мы явно не просили Rails отобразить другой макет....

Надеюсь, поможет,

person stephenmurdoch    schedule 04.07.2010
comment
о да, и если у вас есть только один макет с именем application.html.erb, то рельсы будут использовать его, и вам не нужно указывать его - person stephenmurdoch; 05.07.2010

Этот отрывок из книги в формате PDF из Rails для разработчиков .Net содержит довольно хорошее объяснение Макеты Rails, а также сравнение с ASP.Net MasterPages. Поскольку кажется, что он работает довольно хорошо, он, вероятно, используется довольно часто, по крайней мере, разработчиками, знакомыми с концепцией эталонной страницы.

person DOK    schedule 04.07.2010