2013-07-12 104 views
5

对我的编辑操作如果记录不存在,我永远不会找到没有找到的记录。我做错了什么。未找到Rails 4.0记录

这里是我的编辑操作

class OffersController < ApplicationController 

    rescue_from ActiveRecord::RecordNotFound, with: :record_not_found   

    def show 
     @offer = Offer.find(params[:id]) 
    end   

    def edit 
     @offer = Offer.find_by(edit_hash: params[:edit_hash]) 
     @country = Country.find_by(name: @offer.country) 
     @states = State.find(:all, :conditions => { country_id: @country }) 
    end 

    private 

     def record_not_found 
      render text: "404 Not Found", status: 404 
     end 
    end 

我总是得到未定义的方法'国家”的零:NilClass我的历克西斯特编辑记录。

另外,我提出了未在我的show动作中找到的记录,但我想使用我在公用文件夹中的404.html页面。我怎样才能使用这个文件?

在此先感谢

+0

您是否从控制台运行'rake db:migrate'来填充数据库? –

回答

12

的问题是,你的线@offer = Offer.find_by(edit_hash: params[:edit_hash])不与ActiveRecord::RecordNotFound响应。它的响应是nil

您可以通过从您的应用程序的目录中打开您的Rails控制台以rails c来查看此内容。在控制台中,把这个在:

@offer = Offer.find_by(edit_hash: params[:edit_hash])

你会看到,它的输出是=> nil。然后你可以输入@offer,你会看到它的输出,同样是=> nil。现在,就把这条线到控制台:

@offer = Offer.find(99999)

你会看到,它的输出是ActiveRecord::RecordNotFound: Couldn't find Offer with id=99999

要解决该问题,添加!到您的通话find_by,所以他们是这样的:

@offer = Offer.find_by!(edit_hash: params[:edit_hash])

这将导致滑轨与ActiveRecord::RecordNotFound: ActiveRecord::RecordNotFound而不是nil回应。

+0

谢谢James我真的很感谢你的帮助 – Jean

+1

我刚刚遇到同样的问题,因为我需要将finder从'.find'改为'.find_by_username',嗯,'.find'返回一个RecordNotFound异常,但是'.find_by_ ...'不是 – Flov

+0

是的。 [find](http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find)如果找不到一个或多个id,将会引发'ActiveRecord :: RecordNotFound',[find_by](如果没有记录被发现,http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find_by)将返回'nil'。 –