Подтвердить что ты не робот

Rails 3, как добавить представление, которое не использует тот же макет, что и остальные приложения?

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

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

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

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

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

4b9b3361

Ответ 1

По умолчанию 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

Ответ 2

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

layout 'layout_one'

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

это будет сделано.

Ответ 3

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

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

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

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

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

Ответ 5

Ну, если это другое представление для мобильных устройств, но все настольные версии одинаковы, вы можете использовать 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.