Bonjour,

Je cherche le moyen d'appeller une action d'un controller depuis une vue.
Je m'explique:
J'ai une sidebar dynamique, avec affichage des derniers articles. Hors je ne veux pas créer une variable @last_articles sur chaque action de tout mes controllers ...
Ce que je voudrai faire, c'est appeller la methode sidebar de mon controller depuis la vue. (Et y foutre un cache 1h, mais ça, je sais faire ;))

J'ai essayé d'utiliser les helpers, comme ci-dessous

class PagesController < ApplicationController
  helper_method :sidebar

[...]
  def index()
    [...]
  end

  def sidebar
    @articles_aside = Article.where("available_from > ?", Time.now).order(available_from: :desc).limit(@aside_count_art)
  end

end

Et d'appeller la methode sur ma vue (ici, le layout)

[...]
<div class="container">
          <%# Affichage contenu %>
          <%= yield %>

          <%# Affiche la sidebar, toutes mes tentatives %>
          <%= render(:template => "pages#sidebar") unless defined?(@hide_aside) && @hide_aside == true %>
          <%= render(:template => "pages/sidebar") unless defined?(@hide_aside) && @hide_aside == true %>
          <%= sidebar() unless defined?(@hide_aside) && @hide_aside == true %>
          <%= render(sidebar()) unless defined?(@hide_aside) && @hide_aside == true %>
        </div>
[...]

Voilà, je ne sais pas si finalement c'est possible avec Rails 5, ou s'il existe une autre méthode pour faire ça.

Si ce n'est toujours pas clair, voilà la version symfony2 de ce que j'essaye de faire ici :

{{ render(controller('ArticleBundle:Article:sidebar')) }}

Merci :)

6 réponses


TransientDev
Réponse acceptée

Bonsoir,

Ce n'est pas possible de le faire avec un before_filter au niveau de application_controller?

class ApplicationController < ActionController::Base
    before_filter :load_latest_articles
    def load_latest_articles
        @last_articles = Article.order('created_at DESC').limit(....)
    end
end

Et ainsi tu peux accéder à tes articles dans toutes les vues.

Bien cordialement,
TD

fital
Réponse acceptée

Sinon HS mais tu peux utiliser les cells si tu connais (notament sur CakePHP).

ça te permet de faire directement une sidebar avec tes articles accessible facilement :
https://github.com/apotonick/cells

Bonjour.
Dans la documentation de Ruby on Rails, il y a ceci : Layouts and Rendering in Rails » Rendering an Action's Template from Another Controller, ceci devrait donc répondre à ta question.

Bousty
Auteur

J'avais déjà vu cette doc, mais il semble qu'il s'agit d'appeller un controller depuis un controller. Hors je veux pouvoir appeller depuis une vue/layout.

En effet, ça permet de rendre le résultat de l'action d'un controlleur dans la vue d'un autre controlleur, désolé de ne pas avoir répondu à ta demande correctement.
Ne connaissant que trop peu Ruby on Rails, je laisse les connaisseurs te répondre.

Bousty
Auteur

Petit up ?