Rails 3, как добавить представление, которое не использует тот же макет, что и остальные приложения?
Я не мог найти никаких документов или примеров о том, как структурировать мое приложение, чтобы разные представления в одном контроллере могли использовать совершенно разные макеты и таблицы стилей.
Наше приложение было подкрашено, и затем мы использовали nifty-генераторы для создания представлений, а затем добавили для проверки подлинность. У нас есть взгляды и контроллеры для двух моделей: виджеты и компании.
В настоящее время у меня есть один макет: layouts/application.html.haml, я не вижу ссылки, где бы вы ни находились, поэтому я предполагаю (новичок в рельсах), что он всегда используется в соглашении об именах.
Теперь мне нужно добавить пару представлений (для мобильных браузеров), которые имеют другую таблицу стилей и макет (например, без ссылок входа/выхода из системы в верхнем правом углу), внутри тех же контроллеров.
Как это можно сделать?
Ответы
Ответ 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.