0

在我的 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

4

3 回答 3

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
于 2012-10-11T00:27:57.837 回答
2

如果你不进入if,你site将成为nil
如果你不设置returnredirect该函数将一直向下,即使你没有 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
于 2012-10-11T00:31:27.890 回答
1

似乎将执行重定向后的指令。这是一篇引用此问题的文章。

解决此问题的一种方法是return重定向,如下所示:

def show_html
  site_list = Site.where(:url => 参数[:url])
  如果 site_list.length > 0
    站点 = site_list.first

  别的
    返回redirect_to“http://www.google.com”
  结尾

  @html = 网站.html
  渲染“show_html.html.erb”

结尾
于 2012-10-11T00:19:10.323 回答