2010-09-08 3 views
3

J'ai un modèle d'événements qui a deux champs nommés:Puis-je attacher une portée nommée à un lien dans Rails?

class Event < ActiveRecord::Base 
    scope :future, lambda { where('events.date >= ?', Time.zone.now) } 
    scope :past, lambda { where('events.date <= ?', Time.zone.now) } 
end 

J'appelle ces champs d'application de mon contrôleur en créant deux nouvelles actions de contrôleur (appelé « futurs » et « passé »):

Mon contrôleur :

class EventsController < InheritedResources::Base 
    actions :index, :show, :future, :past 

    has_scope :future 
    has_scope :past 

    def future 
    index! { @events = Event.future } 
    end 

    def past 
    index! { @events = Event.past } 
    end 
end 

J'ai également des vues et des routes pour ces actions supplémentaires.

Cela fonctionne très bien. Ma demande fait ce que je veux et je peux créer un lien vers les nouvelles actions dans ma barre latérale comme suit:

%li 
    = link_to 'Events Home', events_path 
%li 
    = link_to 'Future Events', future_events_path 
%li 
    = link_to 'Past Events' past_events_path 

Maintenant, mon problème avec cette configuration est que, si cela fonctionne très bien, je n'aime pas le fait que Je dois créer de nouvelles actions, vues et routes pour ces étendues supplémentaires. Je ne pense pas que je fais ça de la bonne façon. Essentiellement, j'essaie de filtrer les résultats sur la page d'index, mais je dois créer de nouvelles actions, routes et vues pour le faire. Cela semble un peu lourd et je me demande s'il y a un autre moyen.

Ce serait bien si je pouvais en finir avec les actions de « futur » et contrôleur « passé » et il suffit d'appeler les champs d'application de la vue comme ceci:

%li 
    = link_to 'Events Home', events_path 
%li 
    = link_to 'Future Events', events_path.future 
%li 
    = link_to 'Past Events' events_path.past 

Il est évident que cela ne fonctionne pas. Je l'ai vu an example qui utilise une aide de select_tag personnalisée mais je peux tout à fait modifier pour travailler sans balise select ou JS ...

Est-il préférable de coller avec la méthode actuelle

Répondre

3

L'utilisation de send en fonction d'un paramètre externe est un peu dangereuse. Je recommande le has_scope gem

5

Vous pourriez avoir seule l'action de l'indice et passer le champ en tant que paramètre, vous ferait:

Event.send(params[:scope] : 'all') 

le champ d'application pourrait être adoptée comme:

link_to "Future events", events_path(:scope => "future") 
+0

merci beaucoup, cela fonctionne parfaitement - ça aide vraiment! – stephenmurdoch

+0

Pouvez-vous toujours le faire en utilisant les rails 4 ou 5 dans l'action d'index? –

Questions connexes