使用DataMapper get在Rails3控制器中处理404的最佳方法

时间:2010-08-18 18:16:33

标签: ruby-on-rails ruby activerecord ruby-on-rails-3 datamapper

这很简单,我想通过调用DataMapper来处理正常的[show]请求,就像我在Merb中一样。

使用ActiveRecord我可以做到这一点:

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

它通过捕获资源的异常来处理404。

DataMapper不会自动执行此操作,因此我现在正在使用此解决方案解决此问题: [感动答案]

可以告诉控制器在not_found函数内停止吗?

3 个答案:

答案 0 :(得分:9)

我喜欢使用异常抛出,然后使用ActionController的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

答案 1 :(得分:0)

完成'旧的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
再次

:可以告诉控制器在not_found函数内停止而不是在show动作中显式调用'return false'吗?

编辑:感谢Francois找到更好的解决方案:

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

答案 2 :(得分:0)

As DM documentation says,您可以使用#get!