2010-07-30 154 views
18

我认为代码是更明确的从另一个控制器渲染控制器动作

选项甲

class RedirectController < ApplicationController 
    def index 
    redirect_to :controller => 'posts', :action => 'show', :id => 1 
    # it works 
    end 
end 

选择B

class RedirectController < ApplicationController 
    def index 
    render :controller => 'posts', :action => 'show', :id => 1 
    # it doesn't work 
    end 
end 

是可能的(B)加载在另一个另一个动作控制器? (而不仅仅是视图)如何? 感谢

+0

你为什么要这么做?如果你告诉我们你正在努力解决的根本问题可能会更好。 – 2010-07-30 09:38:51

+0

“根本问题”是我想要自由地设置一些网址,只要我不想触摸routes.rb – user142913 2010-07-30 16:50:50

+3

只是为了澄清,您的选项A不会呈现来自另一个控制器的操作,它会以当前的请求将浏览器指向另一个控制器的重定向(因此会导致第二个请求触发另一个控制器)。 'render:template =>'posts/show'然而直接呈现另一个控制器的模板。当然你需要设置模板显示的东西(比如你的@post var)。 我不知道我是否明白你想做什么,但通常你不能设置url而不触及routes.rb,因为这就是routes.rb的好处。 – Zargony 2010-08-02 14:43:40

回答

35

嗨尝试render 'posts/show'render :template => 'posts/show'

+0

感谢它在两种方式,但它不是很干净,因为我不得不添加@post .. @post = Post.find 1 render'posts/show' – user142913 2010-07-30 16:47:39

+0

render_component应该做的伎俩,但它已过时 – user142913 2010-08-29 22:34:42

+0

这工作,但不会渲染操作模板周围的其他控制器模板。有没有办法强制呢? – elsurudo 2013-01-07 15:59:24

0

就呈现模板

def index 
    render 'posts/show' 
end 

这其中也适用

def index 
    render template: 'posts/show' 
end 

如果你想在其他一些布局呈现

def index 
    render template: 'posts/show', layout: 'different_layout' 
end