Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2016-08-18T10:24:32+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Macro ne fonctionne pas avec une variable en argument, message #1206262016-08-18T10:24:32+02:00Necros211/@Necros211https://zestedesavoir.com/forums/sujet/6729/macro-ne-fonctionne-pas-avec-une-variable-en-argument/?page=1#p120626<p>Je pense avoir une solution qui est de lire le fichier à la compilation et de coder un switch case dans ma macro.
Mais du coup ca risque de me faire des gros switch case dans mon code (même si c'est des macros et que cela ne se vois pas)</p>
<p>Es-ce que c'est une bonne solution? (Dans tous les cas, ca ressemble juste à une solution de secours :/) </p>
<p>Merci de votre aide.</p>Macro ne fonctionne pas avec une variable en argument, message #1203872016-08-15T21:53:00+02:00Necros211/@Necros211https://zestedesavoir.com/forums/sujet/6729/macro-ne-fonctionne-pas-avec-une-variable-en-argument/?page=1#p120387<p>Salut tous le monde.</p>
<p>J'ai un problème avec les macros en langage Crystal.</p>
<p>En effet, ceux-ci sont exécuté lors du passage du compilateur, sauf que les routes de mon routeurs son paramétré à partir d'un fichier YAML</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="nn">---</span>
<span class="l l-Scalar l-Scalar-Plain">base</span><span class="p p-Indicator">:</span>
<span class="l l-Scalar l-Scalar-Plain">name</span><span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">api</span>
<span class="l l-Scalar l-Scalar-Plain">description</span><span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">Exemple</span>
<span class="l l-Scalar l-Scalar-Plain">version</span><span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">1</span>
<span class="l l-Scalar l-Scalar-Plain">collections</span><span class="p p-Indicator">:</span>
<span class="l l-Scalar l-Scalar-Plain">users</span><span class="p p-Indicator">:</span>
<span class="l l-Scalar l-Scalar-Plain">description</span><span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">Users</span>
<span class="l l-Scalar l-Scalar-Plain">verbs</span><span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">CRUD</span> <span class="c1"># Default</span>
<span class="l l-Scalar l-Scalar-Plain">klass</span><span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">User</span> <span class="c1"># Default</span>
<span class="l l-Scalar l-Scalar-Plain">collection_actions</span><span class="p p-Indicator">:</span> <span class="c1"># /users/something</span>
<span class="l l-Scalar l-Scalar-Plain">get</span><span class="p p-Indicator">:</span>
<span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">something</span>
<span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">else</span>
<span class="l l-Scalar l-Scalar-Plain">resource_actions</span><span class="p p-Indicator">:</span> <span class="c1"># /users/:id/something</span>
<span class="l l-Scalar l-Scalar-Plain">get</span><span class="p p-Indicator">:</span>
<span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">messages</span>
<span class="l l-Scalar l-Scalar-Plain">emails</span><span class="p p-Indicator">:</span>
<span class="l l-Scalar l-Scalar-Plain">description</span><span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">Emails</span>
<span class="l l-Scalar l-Scalar-Plain">verbs</span><span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">R</span>
<span class="l l-Scalar l-Scalar-Plain">klass</span><span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">Email</span>
</pre></div>
</td></tr></table>
<p>Ma structure est la suivante: </p>
<ul>
<li>L'utilisateur allume son serveur Web.</li>
<li>Le serveur web lit le fichier de conf et enregistre les routes dans des nodes. (Routeur + Nodes => <a href="https://github.com/Cruder/Opali/tree/feature/4/router/src/Opali/router">https://github.com/Cruder/Opali/tree/feature/4/router/src/Opali/router</a> )</li>
<li>L'utilisateur veux accédé à la page /users</li>
<li>Le serveur regarde toutes les nodes jusqu'à ce qu'il trouve la bonne node. (Sinon 404)</li>
<li>Le serveur appel le bon controller avec la bonne méthode.</li>
<li>Le serveur transforme en JSON le résultat puis l'envoie à l'utilisateur.</li>
</ul>
<p>Voici la macro qui me pose problème: </p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3</pre></div></td><td class="code"><div class="codehilite"><pre><span></span>macro controller_call(controller, params, method)
{{controller.id}}.new({{params}}).{{method.id}}()
end
</pre></div>
</td></tr></table>
<p>En appelant ma macro comme suit, je n'ai aucun problèmes</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="codehilite"><pre><span></span>controller_call("UsersController", CONTEXT, "index")
</pre></div>
</td></tr></table>
<p>Mais en passant par une variable, cela ne fonctionne plus, et me donne ceci</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="codehilite"><pre><span></span>@klass.new(...).@method()
</pre></div>
</td></tr></table>
<p>Comment faire pour pouvoir appeler le bon controlleur? (sachant qu'ils héritent tous de <code>Opali::Base::Controller</code>)</p>
<p>Merci de votre aide.</p>
<p>(J'ai fait un petit git diff <a href="https://github.com/Cruder/Opali/compare/feature/4/router">https://github.com/Cruder/Opali/compare/feature/4/router</a> pour voir plus facilement le code correspondant)</p>
<p><strong>edit elyppire : titre modifié pour plus de clarté.</strong></p>