рельсы 3, как добавить представление, которое не использует тот же макет, что и остальные приложения? - PullRequest
51 голосов
/ 23 февраля 2011

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

Наше приложение было защищено, и затем мы использовали генераторы niftyдля создания просмотров, а затем добавил устройство для аутентификации.У нас есть представления и контроллеры для двух моделей: виджетов и компаний.

В настоящее время у меня есть один макет: layouts / application.html.haml, я нигде не вижу ссылок, поэтому я предполагаю (новичок в рельсах)что он всегда используется соглашением об именах.

Теперь мне нужно добавить пару представлений (для мобильных браузеров), которые имеют другую таблицу стилей и макет (например, нет ссылок для входа / выхода из системы в правом верхнем углу),внутри одних и тех же контроллеров.

Как это можно сделать?

Ответы [ 5 ]

129 голосов
/ 23 февраля 2011

По умолчанию layouts/application.html.haml (.erb, если вы не используете haml).

Фактически, файл макета может быть установлен для каждого контроллера или для каждого действия, а не для каждого представления, для каждой папки представления.

Существует несколько случаев:

Чтобы изменить файл макета по умолчанию для всех контроллеров (т. Е. Используйте another.html.haml вместо application.html.haml)

class ApplicationController < ActionController::Base
  layout "another"

  # another way
  layout :another_by_method
  private
  def another_by_method
    if current_user.nil?
      "normal_layout"
    else
      "member_layout"
    end
  end
end

Для изменениявсе действия в определенном контроллере для использования другого файла макета

class SessionsController < ActionController::Base
  layout "sessions_layout"
  # similar to the case in application controller, you could assign a method instead
end

Чтобы изменить действие для использования другого файла макета

def my_action
  if current_user.nil?
    render :layout => "normal_layout"
  else
    render :action => "could_like_this", :layout => "member_layout"
  end
end
4 голосов
/ 27 августа 2015

Я уверен, что есть много ответов на этот вопрос, но вот еще один, где вы можете использовать разные макеты для контроллеров или для действий.

class ListingsController < ApplicationController
  # every action will use the layout template app/views/layouts/listing_single.html.erb
  layout 'listing_single'
  # the 'list' action will use the layout set in the 'alternative_layout' method
  # you can also add multiple actions to use a different layout,just do like layout :alternative_layout, only: [:list,:another_action]
  layout :alternative_layout, :only => :list

   def show
   end   

   def list
   end

   private
   def alternative_layout
    if current_user.is_super_admin?
       #if current use is super admin then use the layout found in app/views/layouts/admin.html.erb otherwise use the layout template in app/views/layouts/listing_list.html.erb
      'admin'
    else
      'listing_list'
    end
  end
end
4 голосов
/ 28 октября 2013

Если вы не хотите идти слишком сложным, вы можете просто сделать это:

layout 'layout_one'

 def new
   @user= User.new
  render layout: 'landing_page'
  end

это подойдет.

3 голосов
/ 23 февраля 2011

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

Направляющие рельсы по компоновкам - хорошее место для начала.Посмотрите на Раздел 3 - Структурирование макетов

Существует несколько способов использования другого макета, но один из самых простых - просто добавить файл с тем же именем, что и ваш контроллер, в layouts/ папка.Таким образом, если ваш контроллер PostsController, то добавление layouts/post.html.haml заставит рельсы использовать этот макет.Если такой макет не найден и другие макеты не указаны, рельсы будут использовать значение по умолчанию layouts/application.html.haml

1 голос
/ 23 февраля 2011

Что ж, если для мобильных устройств это другое представление, но все версии для настольных компьютеров одинаковы, вы можете использовать JQtouch.

http://railscasts.com/episodes/199-mobile-devices

# config/initializers/mime_types.rb
Mime::Type.register_alias "text/html", :mobile

# application_controller.rb
before_filter :prepare_for_mobile

private

def mobile_device?
  if session[:mobile_param]
    session[:mobile_param] == "1"
  else
    request.user_agent =~ /Mobile|webOS/
  end
end
helper_method :mobile_device?

def prepare_for_mobile
  session[:mobile_param] = params[:mobile] if params[:mobile]
  request.format = :mobile if mobile_device?
end

Код выше взят изпример Railscasts.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...