如何在页面之前重定向不存在'铁轨错误?

时间:2014-05-08 23:20:33

标签: ruby-on-rails ruby

我有一个rails应用程序,每次发布帖子时都会发布一个显示页面网址(在我的应用中称为sub_opp)。

所以当发布某些内容时,会发布一条包含www.app.com/sub_opp/1等链接的推文

用户可以取消这些帖子。我试图在节目之前做一个表示如果它是空白的,重定向到主页并闪现通知但是似乎未找到的ID击败了它。这是我的before_action。

def validate_opp_open
  sub_opp = SubOpp.find(params[:id])
  if sub_opp.blank?
    redirect_to sub_opps_url, notice: 'Sorry.  This opportunity is no longer available.'
  end
end

它挂在sub_opp = SubOpp.find(params [:id])行上,说它无法找到它,这是有道理的。有没有办法解决这个问题?

这是答案

 def validate_opp_open
  sub_opp = SubOpp.find_by(id: params[:id])
  if sub_opp.blank?
    redirect_to sub_opps_url, notice: 'Sorry.  This opportunity is no longer available.'
  end
 end

4 个答案:

答案 0 :(得分:0)

变化:

sub_opp = SubOpp.find(params[:id])

要:

sub_opp = SubOpp.find_by(id: params[:id])

答案 1 :(得分:0)

ActiveRecord提供检查记录是否存在的工具:

SubOpp.exists?(params[:id])

答案 2 :(得分:0)

问题是找不到会导致异常,如果它没有成功。您可以使用rescue捕获异常或使用

sub_opp = SubOpp.where(:id => params[:id]).first

当找不到记录时,这将产生nil。这可以在Rails 3和4之间移植。@ BroiSatse的解决方案更优雅,但它只适用于Rails 4.在Rails 3中,你必须说

sub_opp = SubOpp.find_by_id(params[:id])

rescue方法类似于:

def validate_opp_open
  sub_opp = SubOpp.find(params[:id])
  rescue ActiveRecord::RecordNotFound => e
    redirect_to sub_opps_url, notice: 'Sorry.  This opportunity is no longer available.'
end

答案 3 :(得分:0)

def validate_opp_open
  unless sub_opp = SubOpp.find(params[:id])
    redirect_to sub_opps_url, notice: 'Sorry.  This opportunity is no longer available.'
  end
end