在我的Rails 3.2项目中,在我的控制器中,我有一个show_html
功能。如果它可以在数据库中找到具有特定URL的站点,它将把它传递给视图。否则,我希望它重定向到http://www.google.com
def show_html
site_list = Site.where(:url => params[:url])
if site_list.length > 0
site = site_list.first
else
redirect_to "http://www.google.com"
end
@html = site.html
render "show_html.html.erb"
end
当我测试它并site_list.length > 0
时,它有效。但是当site_length_list = 0
时,它会给出错误undefined method 'html' for nil:NilClass
。为什么不进入else
语句并渲染google.com
?
答案 0 :(得分:2)
重定向后,您不需要渲染(以及在其他条件下为nil.html的site.html)。你需要其中一个。
def show_html
site_list = Site.where(:url => params[:url])
if site_list.length > 0
site = site_list.first
@html = site.html
render "show_html.html.erb"
else
redirect_to "http://www.google.com"
end
end
答案 1 :(得分:2)
如果您未进入if
,则site
将为nil
。
如果你没有用return
设置redirect
,那么函数就会一直向下,即使你没有nil错误,你可能会得到另一个重定向+渲染。
定义功能的简洁方法
def show_html
site_list = Site.where(:url => params[:url])
return redirect_to "http://www.google.com" if site_list.empty?
site = site_list.first
@html = site.html
render "show_html.html.erb"
end
答案 2 :(得分:1)
似乎重定向后的指令将被执行。这是引用此问题的article。
解决此问题的一种方法是return
重定向,如下所示:
def show_html site_list = Site.where(:url => params[:url]) if site_list.length > 0 site = site_list.first else return redirect_to "http://www.google.com" end @html = site.html render "show_html.html.erb" end