web-dev-qa-db-fra.com

Rails 3 rend l'action d'un autre contrôleur

J'ai besoin de rendre une autre action du contrôleur <%= render "controller/index" %>.__ et j'obtiens cette erreur 

Contrôleur/index partiel manquant avec {: formats => [: html],: locale => [: en,: en],: handlers => [: rjs,: rhtml,: rxml,: erb,: builder]} in chemins de vue "/ path_to/app/views"

comment puis-je rendre une autre action de contrôleur dans une vue mais sans envoyer de redirection au client? J'ai essayé

<%=render :action => "index", :controller=>"controller" %>

mais il semble que cela ne fonctionne pas.

25
Mihai

Essayez de rendre le modèle:

<%= render :template => "controller/index" %> 

Ou fichier:

<%= render :template => "#{Rails.root}/app/controllers/controller/index" %> 

Et je crois que vous devriez le faire passer par le contrôleur, dans la mesure où cela est plus pratique:

def your_action
  ...
  render :action => :index
end
29
fl00r

Cela fonctionne bien pour moi:

def renderActionInOtherController(controller,action,params)
  controller.class_eval{
    def params=(params); @params = params end
    def params; @params end
  }
  c = controller.new
  c.request = @_request
  c.response = @_response
  c.params = params
  c.send(action)
  c.response.body
end

alors, appelez par 

render :text => renderActionInOtherController(OtherController,:otherAction,params)

fondamentalement, il pirate l’autre classe et écrase sa méthode "params" et le retourne

Si vous utilisez Rails 4:

def renderActionInOtherController(controller,action,params)
    c = controller.new
    c.params = params
    c.dispatch(action, request)
    c.response.body
end
21
gene tsai

De Rails Guides page :

Utiliser render avec: action est un source fréquente de confusion pour Rails nouveaux venus. L'action spécifiée est utilisé pour déterminer la vue à restituer, mais Rails ne lance aucun des fichiers le code pour cette action dans le manette. Toute variable d'instance que vous avez besoin dans la vue doit être mis en place dans l'action en cours avant appelant rendre.

En bref, vous ne pouvez pas rendre une autre action, vous pouvez uniquement rendre un autre modèle. Vous pouvez obtenir le code partagé et le déplacer vers une méthode du contrôleur d'application. Vous pouvez également essayer quelque chose dans ce sens si vous ne pouvez vraiment pas structurer votre code d'une autre manière:

# This is a hack, I'm not even sure that it will work and it will probably
# mess up your filters (like ignore them).
other_controller = OtherController.new
other_controller.request = @_request
other_controller.some_action
19
Marek Sapota

Si vous ne voulez pas simplement rendre la view de l'autre contrôleur (/ modèle), mais appeler la action (méthode), réfléchissez davantage au mode de vie Ruby - mettez cette méthode dans une module et incluez-la dans les contrôleurs vous en avez besoin.

Je pense que c'est moins «effrayant» que de toucher d'une manière ou d'une autre un autre contrôleur. 

module StandardActions
    def show_user_homepage(local_params=params)
        #something finding 
        #something to check
        render :"homepage/show" 
    def
end

class AddressesController < ApplicationController
    include StandardActions

    def update
        # update address
        if ok
            show_user_homepage(id: user_id)
        else
            #errorthings
            render :edit #(eg.)
        end
    end         
end

class HobbiesController  < ApplicationController
    include StandardActions

    def update      
        # update hobby
        if ok
            show_user_homepage(id: user_id)
        else
            #errorthings
            render :edit #(eg.)
        end
    end         
end
0
halfbit