【问题标题】:Render specific method outside the application.html.erb template在 application.html.erb 模板之外渲染特定方法
【发布时间】:2013-09-02 12:38:03
【问题描述】:

我正在尝试在我的 web 应用上为用户制作某种个人页面。因此,我想使用与其他页面不同的 CSS 模板和布局。

例如,我的所有布局都在 application.html.erb 中,其中所有内容都在“yield”调用中呈现。

现在我想要控制器的特定方法(例如,UsersController 中的 show_personal_page)重定向到完全不同的布局和样式(甚至可以为每个用户定制)。问题是我所做的任何事情都会通过 application.html.erb 模板,因此看起来是一样的。

我想到了一种方法是在 application.html.erb 中放置 'if' 和 'else' 子句,但这似乎并不正确(即根本不是 rails 样式)

有什么想法吗?

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    您始终可以通过在顶部定义控制器来为控制器定义自定义布局:

    class UsersController
      layout 'user'
      .
      .
    end
    

    事实上,如果您在 app/views/layout 中创建名称为 users.html.erb 的布局,Rails 将自动为 users_controller 中的每个视图使用该布局(即,如果您使用控制器名称创建布局)。

    如果你想在控制器中为特定方法使用布局,你可以使用

    class UsersController
      layout 'user', :only => :show_personal_page
      .
      .
    end
    

    也可以直接在方法中调用布局

    class UsersController
      def show_personal_page
        .
        render :layout => :user
      end
    end
    

    您可以选择不使用任何布局,方法是在方法中使用render :layout => false,或者在控制器顶部使用layout nil。

    如果你想有条件地指定布局,最好的方法是这样

    class UsersController
      layout :conditional_layout, :only => :show_personal_page
    
      def conditional_layout
        ..(your condition)
        (return correct layout)
      end
      .
      .
    end
    

    【讨论】:

      【解决方案2】:

      您可以从用户控制器呈现特定布局:

      class UsersController < ApplicationController
        ...
      
        def controller_method
          #should be a string (:layout requires a string)
          var user_specific_layout = get_specific_layout(user)
          render :layout  => user_specific_layout
        end
      end
      

      查看Layouts and Rendering in Rails 指南了解更多信息。

      【讨论】:

        【解决方案3】:

        在views/layouts/user.html.erb 中创建一个新布局,然后在控制器中设置它:

        layout 'user'
        

        或者你可以设置layout false并将页面的所有结构放在视图文件中,完全不依赖于布局。

        【讨论】:

          【解决方案4】:

          您也可以将 proc 传递给布局方法:

          def MySuperController < ApplicationController
            layout Proc.new{|controller| controller.current_user.layout}
            ...
          end
          

          【讨论】:

            猜你喜欢
            • 2014-04-11
            • 1970-01-01
            • 2016-02-02
            • 1970-01-01
            • 1970-01-01
            • 2014-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多