Render suivant le nom de method d'un controller

17372
,

Bonjour,

ce que je veux faire c'est ne pas avoir le bordel dans le dossier views de mes pages statics.
Pour cela je créer des sous-dossiers mais du coup rails ne trouve plus mes .html.erb.

Ce que je fais

dans un premier temps je défini mes actions:

class PagesController < ApplicationController
def welcome
end
def administration
end
def administration_users
end
end

et je crée mes routes.

PagesController.action_methods.each do |action|
 path = action.split('_').join('/')
  get "/#{path}", to: "pages##{action}", as: "#{action}_page"
end

Easy, fastoche, ça fonctionne tout seul. \0/
Mais la ou c'est un peu problematique c'est au moment du rendu de la vue.
Car (si j'ai bine compris) Rails va automatique chercher une vue qui correspond au nom de l'action qui est dans le controller.

Je peux outrepasser ça en spécifiant dans mon action

def administration_users
 render "pages/administration/users"
end

et cela fonctionne comme souhaité (youpi) mais cela va être relativement chiant à gerer.

Comment puis-je faire une fonction qui ferais un render automatiquement si l'action à un "_". (pour les views de premier niveau on peut garder le fonctionne de rails par defaut)

Merci

4 Réponse

45305
,

Pourquoi pas quelquechose comme ceci (pas testé):

def auto_render
    render [controller_name.classify.lowercase.pluralize, __method__.to_s.split('_')].join('/')
end

Je suis pas sur si le join va marcher comme je le prévoi mais bon..

Cordialement,
TD

17372
,

J'ai modifié

render [controller_name, action_name.to_s.split('_')].join('/')

method retourne auto/render. :)

For versions >= 1.9:
def funky_method
    return __callee__
end

For versions < 1.9:
def funky_method
    return __method__
end

mais la je ne sais pas after_action ou before_action ?

before_action :auto_render, if:->{action_name.to_s.in? "_"}
after_action :auto_render, if:->{action_name.to_s.in? "_"}

pour que les variables dans les différentes method soit accessible dans les pages.
genre ça :

def administration_users
        @users = User.all
    end
45305
,

Je ne pense pas que tu puisse insérer un evenement après le traitement de la méthode et avant le render. A mon avis tu va devoir appeler la fonction à la place du render.
Après j'ai trouvé un tuto pour un before render concern mais je sais pas s'il est toujours d'actualité. ( ici)

Default
,

Ok merci pour ta réponse en soit c'est tres clair pour ma part on a déjà une api et j'ai commencé a lire la doc vue js donc je vois comment rendre le tout. google street view