rails 3,如何添加一个不使用与其余应用程序相同布局的视图?

我找不到任何有关如何构建我的应用程序的文档或示例,以允许同一控制器中的不同视图使用完全不同的布局和样式表。

我们的应用程序被搭建起来,然后我们使用了漂亮的生成器来生成视图,然后添加了用于身份验证的设计。 我们有两种模型的视图和控制器:小部件和公司。

我目前只有一个布局:layouts / application.html.haml,我在任何地方都看不到它,因此我假设(一个Rails新手)它总是被命名约定使用。

现在,我需要在同一控制器中添加几个视图(用于移动浏览器),这些视图具有不同的样式表和布局(例如,右上角没有登录/注销链接)。

那怎么办?

jpwynn asked 2020-01-23T02:39:21Z
5个解决方案
129 votes

默认情况下为another.html.haml(如果不使用haml,则为application.html.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
PeterWong answered 2020-01-23T02:40:07Z
4 votes

如果您不想太复杂,只需执行以下操作:

layout 'layout_one'

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

这样就可以了。

Lesly Revenge answered 2020-01-23T02:40:32Z
4 votes

我敢肯定有很多答案,但是这是另一个答案,您可以在每个控制器或每个动作中使用不同的布局。

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
zechtz answered 2020-01-23T02:40:52Z
3 votes

是的,您可以在同一控制器中使用不同的布局和样式表。

关于布局的导轨指南是一个很好的起点。 看看第3节-结构化布局

有几种使用不同布局的方法,但最简单的方法之一是在layouts/文件夹中简单添加一个与控制器名称相同的文件。 因此,如果您的控制器为PostsController,则添加layouts/post.html.haml会导致导轨使用该布局。 如果未找到此类布局,并且未指定其他布局,则rails将使用默认值layouts/application.html.haml

Dty answered 2020-01-23T02:41:21Z
1 votes

好吧,如果移动设备的视图不同,但是所有桌面版本都相同,则可以使用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示例。

dannymcc answered 2020-01-23T02:41:50Z
translate from https://stackoverflow.com:/questions/5090084/rails-3-how-add-a-view-that-does-not-use-same-layout-as-rest-of-app