1

開発中のアプリケーションで異常な問題が発生しています。

sitemap.xml リソースを生成するコントローラー/ビューを作成しています。ブラウザで表示して初めてテストすると、完全に機能します。

ただし、2 回目にビューを更新すると、ページの結果が返されず、サイトマップが実質的に空になります。

コードを変更した場合。空白行を追加したり削除したりするだけで、最初からサイトマップが正しく生成されます。追加の更新は空です。

これはコードです:

サイトマップ コントローラー

class SitemapController < ApplicationController
    layout nil

    def index
        @pages = Page.where(:publish => true)
        @base_url = "http://#{request.host_with_port}"
        headers['Content-Type'] = 'application/xml'
        def index
            respond_to do |format|
                format.xml
            end
        end
    end
end

ここにsitemap.xml.erbがあります

<?xml version="1.0" ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<% @pages.each do |page| %>
  <url>
    <loc><%= "#{@base_url}/#{page.permalink}" %></loc>
    <lastmod><%= page.updated_at %></lastmod>
    <priority>0.5</priority>
  </url>
<% end unless @pages.nil? %>
</urlset>

そしてルート

match "/sitemap.xml", :to => "sitemap#index", :defaults => {:format => :xml}

奇妙なことに、コントローラーのクエリにあるようです。

@pages = Page.where(:publish => true)

これは、連続して試行すると nil を返しますが、アプリの他の部分での同様のクエリは毎回機能します。Page.all や Page.find :all などの代替方法を使用してみましたが、問題は解決しません。

これもHerokuのアプリにアップロードしたところ、自分の環境のせいなのかと思っていたのですが、Herokuでも発生します。

4

1 に答える 1

3

あなたのSitemapController#index方法はそれ自体を再定義しています。問題を明確にするには:

def fn
  def fn
    2
  end
  1
end

fn
# => 1
fn
# => 2

代わりに試してください:

class SitemapController < ApplicationController
    layout nil

    def index
        @pages = Page.where(:publish => true)
        @base_url = "http://#{request.host_with_port}"
        headers['Content-Type'] = 'application/xml'
        respond_to do |format|
            format.xml
        end
    end
end

また、sitemap_generator宝石はかなりうまく機能します。

于 2012-10-31T03:32:57.770 に答える