我有一个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
答案 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