Dans le routage Rails, une 'ressource' fait référence aux 7 itinéraires standards qui sont créés pour les ressources RESTful: index
, show
, new
, create
, edit
, update
et destroy
. Normalement, cela suffit, mais parfois vous pourriez vouloir créer une autre action.
Dans le modèle, vous voulez créer un scope
qui retourne uniquement les utilisateurs spéciaux:
class User < ActiveRecord::Base
scope :special, where(:special => true)
end
Du côté du contrôleur, il y a deux façons d'aller à ce sujet. Ce que vous proposez est la création d'une action supplémentaire:
match "https://stackoverflow.com/users/special" => "users#special"
resource :users
Dans le contrôleur, votre action spéciale retournerait la portée que vous venez de créer:
class UsersController < ApplicationController
def special
@users = User.special
end
end
Cela va faire ce que vous demandez, mais je suggérerait de ne pas le faire de cette façon. Que faire si vous ajoutez plus tard d'autres drapeaux que vous souhaitez rechercher? Que faire si vous voulez effectuer une recherche par plusieurs drapeaux? Cette solution n'est pas assez flexible pour cela. Au lieu de cela, garder les routes comme ils sont:
resource :users
et il suffit d'ajouter une ligne supplémentaire à votre contrôleur:
class UsersController < ApplicationController
def index
@users = User.all
@users = @users.special if params[:special]
end
end
et maintenant, lorsque vous souhaitez afficher les utilisateurs particuliers, directement simplement à l'utilisateur de /users?special=true
Cette approche est beaucoup plus à l'épreuve du futur, IMO.
(Cette réponse est basée sur Rails-3. Si vous utilisez encore 2.3 laissez-moi savoir)
Dans votre premier exemple, le lambda n'est pas nécessaire. Cela fera l'affaire: scope: special, where (special: true) – noodl
@noodl Merci, encore en train de vous habituer à arel. –
Merci! Belle explication et j'apprécie vraiment que vous allez à la peine de montrer une autre méthode ainsi que le cas trivial. – spinlock