2010-07-30 24 views
18

ich glaube, der CodeController-Aktion von einem anderen Controller Render

Option A

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

Option B

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

ist möglich in (B) deutlicher ist eine andere Aktion in ein anderes zu laden Regler? (und nicht nur die Aussicht) Wie? Dank

+0

Warum möchten Sie das tun? Es ist vielleicht besser, wenn Sie uns das zugrunde liegende Problem mitteilen, das Sie lösen möchten. –

+0

Das "zugrunde liegende Problem" ist, dass ich frei sein will, einige URLs einzurichten, wie ich möchte, ohne Routen zu berühren. Rb – user142913

+3

Nur um zu verdeutlichen, Ihre Option A macht keine Aktion von einem anderen Controller, beantwortet sie die aktuelle Anfrage mit einem Umleitung, die den Browser auf den anderen Controller verweist (daher eine zweite Anfrage, die den anderen Controller trifft). 'render: template => 'posts/show'' hingegen gibt die Vorlage des anderen Controllers direkt wieder. Natürlich müssen Sie Sachen einrichten, damit die Vorlage angezeigt wird (wie Ihre @post var). Ich bin mir nicht sicher, ob ich verstehe, was Sie zu tun versuchen, aber normalerweise können Sie URLs nicht einrichten, ohne routes.rb zu berühren, da routes.rb dafür gut ist. – Zargony

Antwort

35

Hallo versuchen render 'posts/show' oder render :template => 'posts/show'

+0

Danke es funktioniert auf beide Arten, aber es ist nicht sehr sauber, weil ich @post hinzufügen musste. @post = Post.find 1 render 'posts/show' – user142913

+0

render_component sollte den Trick tun, aber es ist veraltet – user142913

+0

This funktioniert, aber rendert die Vorlage des anderen Controllers nicht um die Aktionsvorlage herum. Gibt es eine Möglichkeit, das zu erzwingen? – elsurudo

0

einfach den Schablonen machen

def index 
    render 'posts/show' 
end 

Dieser funktioniert auch

def index 
    render template: 'posts/show' 
end 

Wenn Sie in einem anderen Layout machen möchten

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