3

Facebook の連絡先をすべてインポートする Rails アプリがあります。これには時間がかかります。インポートが後ろで行われている間、「お待ちください」ページを表示できるようにしたいと思います。

コントローラーの同じアクションに render と redirect_to を配置できないようです。これどうやってするの?

if @not_first_time
    Authentication.delay.update_contact_list(current_user)
else
    render 'some page telling the user to wait'
    Authentication.import_contact_list(current_user)
end
redirect_to :root_path, :notice => 'Succesfully logged in'

ユーザーが初めてサイトにアクセスする場合は、「しばらくお待ちください」ページを表示し、インポートを開始し、完了したらルート パスにリダイレクトします。ここで、このデータで多くの処理が行われます。

初めてでない場合は、連絡先の更新をバックグラウンドに置き (delayed_jobs gem を使用)、ホームページに直接移動します。

fb_graph gem を使用して連絡先をインポートしています。これが方法です

def self.import_contact_list(user)
  user.facebook.friends.each do |contact|
  contact_hash = { 'provider' => 'facebook', 'uid' => contact.identifier, 'name' => contact.name, 'image' => contact.picture(size='large') }
  unless new_contact = Authentication.find_from_hash(contact_hash)
    ##create the new contact
    new_contact = Authentication.create_contact_from_hash(contact_hash)
  end
  unless relationship = Relationship.find_from_hash(user, new_contact)
    #create the relationship if it is inexistent
    relationship = Relationship.create_from_hash(user, new_contact)
  end
end

終わり

編集

以下に提案する解決策を追加しました。

アクション「待機」からの「連絡先をインポートする間待機」ビューは次のとおりです。

<script>
jQuery(document).ready(function() {
  $.get( "/import_contacts", function(data) {
    window.location.replace("/")
  });
});
</script>

<% title 'importing your contacts' %>

<h1>Please wait while we import your contacts</h1>
<%= image_tag('images/saving.gif') %>

ありがとう!

4

1 に答える 1

1

1 つの要求は 1 つの応答を受け取ります。コンテンツをレンダリングしてリダイレクトすることはできません。

もし私があなただったら、遅延ジョブで常に長いプロセスを実行するでしょう - 乗客/ユニコーンインスタンスを結びつけることは決して良い考えではありません. 遅延ジョブが完了したかどうかを確認するために定期的に更新される「お待ちくださいページ」をレンダリングします (遅延ジョブの ID を隠しておくと、ジョブがまだデータベースにあるかどうかをテストできます。ジョブが完了すると削除されます)。ジョブが完了したら、結果ページにリダイレクトします。また、ajax を介して定期的なチェック ビットを実行することもできます。

于 2012-04-07T12:58:51.453 に答える