Je suis assez nouveau dans les rails, donc je m'excuse si j'utilise la mauvaise terminologie. P>
J'ai un modèle Menuuiem que je voudrais afficher le contenu de la mise en page. Comment va-t-on passer une variable d'instance dans une mise en page? P>
Je cherchais un assistant de mise en page d'une sorte, mais j'étais incapable de trouver quoi que ce soit. Je cherchais également à définir la variable d'instance dans le contrôleur d'application pour y accéder dans la mise en page, cela fonctionnerait-il? Si oui, quel est le meilleur moyen de faire le faire? P>
Merci! P>
5 Réponses :
Toutes les variables d'instance définies dans les contrôleurs sont automatiquement disponibles par magie de votre vue. Si vous attendez une variable d'instance dans votre présentation pour toutes les actions, vous pouvez envisager de définir la variable d'instance dans un fichier avant_filter ou de l'encapsuler dans une méthode de contrôleur et en utilisant HELPER_METHOD pour le rendre accessible à vos vues. P>
Pourriez-vous élaborer sur le concept avant_filter? J'ai réfléchi à l'aide de l'helper_method, mais je pense que cela ne me permet que d'utiliser sous des vues et non dans la mise en page où j'en ai besoin.
Helper_Method permet la méthode d'être utilisée dans la couche de vue entière, y compris la mise en page, les vues et les aides.
Cela dépend vraiment de ce que vous voulez faire avec le modèle dans le contrôleur: p> dans l'index code>. Je vais deviner, et vous me dites ce dont vous avez besoin de mieux comprendre comment faire cela. Ce code ne fonctionnerait que si votre modèle Menuitem a un champ nommé
nom code>.
.html.erb code> Affichage Fichier: P>
<ul id="menu">
<% @menu_items.each do |menu_item| %>
<%= h menu_item.name %>
<% end %>
</ul>
dans l'affichage items_controller.rb code> (ou quelque chose)
show.html.erb code>: p>
<%= @menu_item.name %>
Deux choses que je noterais. Tout d'abord, vous ne voulez probablement pas faire cette requête chaque fois que vous rendez une page dans votre demande. Vous voulez certainement cacher vos ménulseurs. Deuxièmement, il pourrait être utile de mettre une méthode de commodité sur la classe Menuitems à cacher cette valeur. Donc, si je définis une méthode je peux appeler menuitem.all_for_menu dans ma mise en page et obtenir tous les éléments de menu. Lorsque vous en ajoutez un nouveau ou en modifiez un, vous devez invalider cela. P> Une autre approche de mise en cache serait de mettre les données dans une partie partielle et de cache qui fragment à l'aide de l'appel de cache standard: p> Vous pouvez alors expirer ce fragment en appelant: p>
La manière habituelle de passer des variables à partir de la vue dans la mise en page parent consiste à utiliser la méthode Le contenu de la vue normale est rendu automatiquement dans l'appel code> de rendement code> sans argument dans la mise en page. Mais vous pouvez également mettre un autre contenu d'espace réservé en utilisant content_for code>. (Cette réponse est une copie + pâte d'une réponse similaire que j'ai postée à Cette question )
produire code> avec un argument de symbole et spécifiant ce contenu de la vue avec
content_for code>. P>
App / Vues / Layouts / Posts_Layout.html.erb Code> P>
<%= content_for :menu_items, some_helper_to_generate_menu %>
<h1>Here is you page content</h1>
Désolé je devrais clarifier. Je ne veux pas dire dans une vue, je veux dire les afficher dans une mise en page.