每个动作的Rails布局?

mrb*_*rdo 160 ruby-on-rails

我对某些操作使用不同的布局(主要用于大多数控制器中的新操作).

我想知道指定布局的最佳方法是什么?(我在同一个控制器中使用3个或更多不同的布局)

我不喜欢用

渲染:layout =>'name'

我喜欢这样做

layout'name',:only => [:new]

但我无法使用它来指定2个或更多不同的布局.

例如:

当我在同一个控制器中调用布局2次,使用不同的布局名称和不同的选项时,第一个被忽略 - 这些操作不会显示在我指定的布局中.

注意:我正在使用Rails 2.

Aug*_*aas 289

您可以使用方法来设置布局.

class MyController < ApplicationController
  layout :resolve_layout

  # ...

  private

  def resolve_layout
    case action_name
    when "new", "create"
      "some_layout"
    when "index"
      "other_layout"
    else
      "application"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 很酷,谢谢.如果有人想用单行做更简单的事情,可以采用以下方法.它易于阅读并放置在控制器的顶部.---`layout Proc.new {['index','new','create'] .include?(action_name)?'some_layout':'other_layout'}` (22认同)
  • -1:太复杂了.以下评论(/sf/answers/1484264841/)是最佳选择. (14认同)

小智 193

class ProductsController < ApplicationController
   layout "admin", only: [:new, :edit]
end
Run Code Online (Sandbox Code Playgroud)

要么

class ProductsController < ApplicationController
   layout "application", only: [:index]
end
Run Code Online (Sandbox Code Playgroud)

  • 如果你们中的任何人都读过这个问题你会知道这不是正确的答案,因为我已经在问题本身中描述了这个解决方案,以及为什么它在我的情况下不起作用(3个或更多布局). (11认同)
  • 那么,问题在于您无法访问诸如current_user之类的对象来有条件地确定布局 (2认同)
  • 就像mrbrdo所说,这不是答案。他的问题专门指出“(我在同一控制器中使用3个或更多不同的布局)”。这个答案允许一个布局,一个没有布局,*没有*不同的布局。 (2认同)

小智 48

您可以使用respond_to指定单个操作的布局:

  def foo
    @model = Bar.first
    respond_to do |format|
      format.html {render :layout => 'application'}
    end
  end
Run Code Online (Sandbox Code Playgroud)


yot*_*ami 11

您还可以使用render指定操作的布局:

def foo
  render layout: "application"
end
Run Code Online (Sandbox Code Playgroud)


bar*_*own 8

那个有一个gem(layout_by_action):)

layout_by_action [:new, :create] => "some_layout", :index => "other_layout"
Run Code Online (Sandbox Code Playgroud)

https://github.com/barelyknown/layout_by_action


pun*_*t18 7

在控制器下指定布局的各种方法:

  1. 在下面的代码中,application_1布局在索引下调用,并显示用户控件的操作,并为其他操作调用应用程序布局(默认布局).

    class UsersController < ApplicationController
      layout "application_1", only: [:index, :show]
    end
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在以下代码中,将针对Users控制器的所有操作调用application_1布局.

    class UsersController < ApplicationController
       layout "application_1"
    end
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在以下代码中,仅对用户控制器的测试操作调用application_1布局,并调用所有其他操作应用程序布局(默认).

        class UsersController < ApplicationController
          def test
            render layout: "application_1"
          end
        end
    
    Run Code Online (Sandbox Code Playgroud)


Gre*_*ick 5

精度:

上面看到的是一种不是真正但有效的DRY方式,但是具有一定的精度:布局必须位于变量之后才能使用(“ @some”)。作为:

def your_action
   @some = foo
   render layout: "your_layout"
end
Run Code Online (Sandbox Code Playgroud)

并不是 :

def your_action
   render layout: "your_layout"
   @some = foo
   @foo = some
end
Run Code Online (Sandbox Code Playgroud)

如果您执行before_action ...,那么它也将无法正常工作。

希望能帮助到你。