1

C'est très simple, je veux gérer une requête [show] normale avec un appel à DataMapper comme je l'ai fait dans Merb.Meilleure façon de gérer 404 contrôleurs Rails3 avec un DataMapper get

Avec ActiveRecord je aurais pu faire ceci:

class PostsController 
    def show 
    @post = Post.get(params[:id]) 
    @comments = @post.comments unless @post.nil? 
    end 
end 

et il gère la 404 en attrapant les exceptions de la ressource.

DataMapper ne place pas le faire automatiquement si en ce moment je résoudre avec cette solution: [déplacé dans les réponses]

Il est possible de dire au contrôleur pour arrêter dans la fonction not_found?

+0

C'est la meilleure réponse que je l'ai vu: http://stackoverflow.com/questions/2385799/how-to-redirect-to-a-404-in- rails/4983354 # 4983354 – Kelvin

Répondre

9

J'aime utiliser le lancer d'exception, puis utilisez rescue_from de ActionController.

Exemple:

class ApplicationController < ActionController::Base 
    rescue_from DataMapper::ObjectNotFoundError, :with => :not_found 

    def not_found 
    render file => "public/404.html", status => 404, layout => false 
    end 
end 

class PostsController 
    def show 
    @post = Post.get!(params[:id]) # This will throw an DataMapper::ObjectNotFoundError if it can't be found 
    @comments = @post.comments 
    end 
end 
+0

solution géniale, merci! – makevoid

0

Fait l'ancienne Merb ':

class ApplicationController 
    def not_found 
    render file: "public/404.html", status: 404, layout: false 
    end 
end 

class PostsController 
    def show 
    @post = Post.get(params[:id]) 
    not_found; return false if @post.nil? 
    @comments = @post.comments 
    end 
end 

à nouveau: Il est possible de dire au contrôleur pour arrêter dans la fonction not_found au lieu d'appeler explicitement « return false » dans l'action show?

modifier: Thanx à François qui a trouvé une meilleure solution:

class PostsController 
    def show 
    @post = Post.get(params[:id]) 
    return not_found if @post.nil? 
    @comments = @post.comments 
    end 
end 
+1

Cette réponse est syntaxiquement incorrecte, mais Rails arrêtera le rendu automatique si quelque chose est déjà rendu. Vous devriez faire return not_found if @ post.nil? –

+0

Vous avez raison! return not_found fonctionne et il se sent beaucoup mieux. Mais ma réponse fonctionne correctement et est syntaxiquement correcte. De toute façon merci pour la conjecture, je vais éditer la réponse – makevoid