Rails 3: два разных макета с одним контроллером и действием? - PullRequest
1 голос
/ 29 декабря 2011

Предположим, вам нужен блог с двумя разными макетами.Один макет должен выглядеть как обычный блог с заголовком, нижним колонтитулом, меню и так далее.Другой макет должен содержать только сообщения в блоге и ничего более.Как бы вы это сделали, не потеряв соединение с моделью, форсировав выполнение и рендеринг только одного действия и не допустив повторения (DRY)?

posts_controller.rb

class PostsController < ApplicationController
  layout :choose_layout

  # chooses the layout by action name
  # problem: it forces us to use more than one action
  def choose_layout
    if action_name == 'diashow'
      return 'diashow'
    else
      return 'application'
    end
  end

  # the one and only action
  def index
    @posts = Post.all
    @number_posts = Post.count
    @timer_sec = 5

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @posts }
    end
  end

  # the unwanted action
  # it should execute and render the index action
  def diashow
    index # no sense cuz of no index-view rendering
    #render :action => "index" # doesn't get the model information
  end

  [..]
end

ВозможноЯ хочу пойти по неправильному пути, но не могу найти правильный.

Обновление:

Мое решение выглядит так:

posts_controller.rb

class PostsController < ApplicationController
  layout :choose_layout

  def choose_layout
    current_uri = request.env['PATH_INFO']
    if current_uri.include?('diashow')
      return 'diashow'
    else
      return 'application'
    end
  end

  def index
    @posts = Post.all
    @number_posts = Post.count
    @timer_sec = 5

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @posts }
    end
  end

  [..]
end

config / rout.rb

Wpr::Application.routes.draw do
  root :to => 'posts#index'

  match 'diashow' => 'posts#index'

  [..]
end

Два разных маршрута указывают на одно и то же местоположение (контроллер / действие).current_uri = request.env['PATH_INFO'] сохраняет URL-адрес в переменную, а следующий if current_uri.include?('diashow') проверяет, является ли это маршрут, который мы настроили в нашем rout.rb .

1 Ответ

1 голос
/ 29 декабря 2011

Вы можете выбрать, какой макет отображать в зависимости от определенных условий.Например, параметр в URL-адресе, устройство, на котором отображается страница, и т. Д.

Просто используйте это условие в функции choose_layout вместо выбора макета на основе action_name.Действие diashow не нужно.

...