2015-04-07 101 views
1

是否可以設置從before_filter渲染的視圖?Rails設置視圖在before_filter中渲染

class ProductsController < ApplicationController 
    before_filter :set_special_view 


    def action1 
    # some logic 

    # i do not want to call render here 
    end 

    def action2 
    # some logic 

    # i do not want to call render here 
    end 

    private 

    def set_special_view 
    #self.class.view 'products/v1.html.erb' if some_cond? 
    #self.class.view 'products/v2.html.erb' if anoter_cond? 


    #self.class.layout :somelayout if some_cond? 

    end 
end 

它可以爲佈局

self.class.layout :somelayout if some_cond? 

做的是有設置一個視圖的方法?所以我在before_filter中設置了視圖,我不會觸及操作。

+0

的過程會是:1的before_filter其設置模板運行( '產品/ view1.html.erb'); 2.執行一些邏輯並設置@variables的動作運行(方法'action1'); 3.它呈現before_filter中指定的模板。 –

回答

-1

使用and return在渲染後不運行任何邏輯。

def set_special_layout 
    #render 'products/v1' and return if some_cond? 
    #render 'products/v2' and return if anoter_cond? 

    #self.class.layout :somelayout if some_cond? 

end 
+0

我想渲染後運行邏輯。 –

+0

#template ='products/v1'if some_cond? #template ='products/v2'if anoth_cond? 然後在你的動作邏輯之後, 渲染模板 模板應該是實例變量,不好意思不知道如何正確格式化 – forthowin

+0

template ='v1'不起作用。它只是設置局部變量。我想找到設置模板(視圖)來渲染的方法。像self.template ='v1'。 –

0

它可以通過在我的控制器覆蓋default_render來完成:

class ProductsController < ApplicationController 

before_filter :set_special_view 


    def action1 
    # some logic 

    end 

    def action2 
    # some logic 

    end 

    def default_render(*args) 
    unless @myview.nil? 
     render @myview and return 
    end 

    super 
    end 


    private 

    def set_special_view 
    # decide which view to show here 

    @myview = 'products/v1.html.erb' if cond1? 
    @myview = 'products/v2.html.erb' if cond2? 

    end 
end 

default_render放在 'ActionPack的/ lib目錄/ action_controller /金屬/ implicit_renderer.rb' 只是調用render沒有參數:

module ActionController 
    module ImplicitRender 
    def send_action(method, *args) 
     ret = super 
     default_render unless performed? 
     ret 
    end 

    def default_render(*args) 
     render(*args) 
    end 

    def method_for_action(action_name) 
     super || if template_exists?(action_name.to_s, _prefixes) 
     "default_render" 
     end 
    end 
    end 
end 

在我們的default_render中,我們使用視圖模板調用渲染。

評論如何Rails的位置呈現模板 - http://climber2002.github.io/blog/2015/02/21/how-rails-finds-your-templates-part-1/