【问题标题】:Rails layouts, multiple or inherit?Rails 布局,多重还是继承?
【发布时间】:2012-01-23 20:38:40
【问题描述】:

我想知道执行此操作的最佳方法。我正在阅读有关布局的 Rails 指南,但对此我有些困惑。

我有一个用户控制器和一个会话控制器。用户控制器用于“注册”,会话控制器用于“登录”。这两个控制器都呈现相同的登录和注册布局 (accounts.html.erb)。

一旦他们登录,我想为他们登录时发生的所有事情呈现不同的布局 (application.html.erb)。我的问题是,在用户控制器中,我有一个“显示”操作,即用户配置文件,只有在用户登录时才能查看,但这个“显示”操作使用 accounts.html.erb 布局,因为“创建”和“新建”操作。我希望“显示”操作使用 application.html.erb,而此处的其余操作使用accounts.html.erb。我应该为这类事情使用模板继承,还是用什么正确的方法来处理这类事情?

也许一些代码也会有所帮助:

class UsersController < ApplicationController  
  layout 'accounts'

 def show
   @user = User.find(params[:id])
   @title = @user.name
 end

 def new
   @user = User.new
   @title = "Sign up"
 end

 def create
   @user = User.new(params[:user])
   if @user.save
     sign_in @user
     flash[:success] = "Welcome"
     redirect_to @user
   else
     @title = "Sign up"
     render :action => "new"
   end
 end

结束

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1


    【解决方案1】:

    如果显示操作是该控制器中唯一需要使用“application.html.erb”的操作,则只需在操作结束时使用该布局呈现它。

    render :layout => "application"
    

    如果您希望做一些更强大的事情,您可以向 application_controller.rb 添加一个方法,以根据用户是否登录来确定布局:

    class ApplicationController < ActionController::Base
      ...
      def determine_layout
        if (signed_in) then
          return "application"
        else
          return "accounts"
        end
      end
      ...
    end
    
    class UsersController < ApplicationController
      def show
        @user = User.find(params[:id])
        @title = @user.name
    
        render :layout => determine_layout
      end
    end
    

    这样做的缺点是您必须在要允许两种布局的每个操作的末尾都有确定布局。您不能添加 after_filter 来确定布局,因为该操作已经被渲染。

    【讨论】:

    • 哦,这么简单?我以为你只能这样做来为那个动作渲染一个特定的模板而不是布局……太棒了!谢谢杰夫。
    猜你喜欢
    • 2015-03-10
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多