Лучший способ обработать 404 в контроллерах Rails3 с помощью DataMapper get - PullRequest
1 голос
/ 18 августа 2010

Это очень просто, я хочу обработать обычный запрос [show] с вызовом DataMapper, как я это делал в Merb.

С ActiveRecord я мог бы сделать это:* и обрабатывает 404, перехватывая исключения ресурса.

Вместо этого DataMapper не делает это автоматически, поэтому сейчас я решаю это с помощью этого решения: [перемещено в ответах]

Можно ли заставить контроллер останавливаться внутри функции not_found?

Ответы [ 3 ]

9 голосов
/ 20 августа 2010

Мне нравится использовать исключение, а затем использовать ActionController's rescue_from.

Пример:

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 голосов
/ 19 августа 2010

Как указано в документации DM , вы можете использовать #get!

0 голосов
/ 18 августа 2010

Готово "по старому Мербскому пути":

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

еще раз: можно сказать контроллеру остановить внутри функции not_found вместо явного вызова return false в действии show?

изменить: спасибо Франсуа, который нашел лучшее решение:

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