在同一个控制器中导出两个不同的布局模板?

时间:2016-04-05 13:49:36

标签: ruby-on-rails ruby-on-rails-4

我有一个带有布局的PagesController' pages.html.erb'指定。

  class PagesController < Spree::StoreController
    layout 'pages'
    respond_to :html

    def lifestyle
      render 'lifestyle'
    end

    def co_step_1
      render 'co_step_1'
    end

    def co_step_2
      render 'co_step_2'
    end

  end

是否可以在PagesController中使用另一种使用不同布局的方法? 换句话说,我想在另一种方法中覆盖layout 'pages.html.erb'

4 个答案:

答案 0 :(得分:5)

其他人的答案有点不同。不需要之前的操作或类似操作,只需使用layout和方法来区分要使用的布局,例如:

class PagesController < Spree::StoreController

    layout :resolve_layout
    respond_to :html

    def lifestyle
      render 'lifestyle'
    end

    def co_step_1
      render 'co_step_1'
    end

    def co_step_2
      render 'co_step_2'
    end

   private

   def resolve_layout
     action_name == 'pages' ? 'pages' : 'custom_layout'
   end

end

或者您想用什么逻辑来决定使用哪种布局。

答案 1 :(得分:1)

是。如果需要,您可以设置每个控制器的布局。

def some_special_method
  render layout: "special_layout"
end

Rails指南中有哪些内容非常有用:http://guides.rubyonrails.org/layouts_and_rendering.html#using-render

答案 2 :(得分:1)

是的,您可以指定布局选项

def my_new_layout
  render layout: "my_new_layout"
end

答案 3 :(得分:1)

您还可以添加在每个操作之前运行的方法,以确定布局,例如

 class PagesController < Spree::StoreController
    before_action :set_layout 
    respond_to :html

    def lifestyle
      render 'lifestyle'
    end

    def co_step_1
      render 'co_step_1'
    end

    def co_step_2
      render 'co_step_2'
    end

    private
    def set_layout
      %w(co_step_1 co_step_2).include?(params[:action]) ? "pages" : "other"
    end
  end