Rails:从控制器重定向

时间:2012-10-11 00:14:46

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

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

3 个答案:

答案 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