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.
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
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
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
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