2015-04-07 97 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/