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

リダイレクト後にレンダリング(およびelse状態ではnil.htmlであるsite.html)は必要ありません。そのうちの1つが必要です。

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。で設定し
ないと、関数は完全にダウンします。nil エラーがなくても、リダイレクト + レンダリングで別のエラーが発生する可能性があります。returnredirect

関数を明確に定義する方法

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

リダイレクト後の指示が実行されるようです。この問題を参照している記事は次のとおりです。

この問題を解決する 1 つの方法は、return次のようにリダイレクトすることです。

デフォルト show_html
  site_list = Site.where(:url => params[:url])
  if site_list.length > 0
    サイト = site_list.first

  そうしないと
    redirect_to "http://www.google.com" を返す
  終わり

  @html = site.html
  レンダリング "show_html.html.erb"

終わり
于 2012-10-11T00:19:10.323 に答える