2

Passenger およびルーティング ヘルパー メソッドに関連するため、Rails 3 アプリで見られるルーティング動作を理解するのに本当に苦労しています。簡単な概要は次のとおりです。

ユーザーが私のサイトに登録するとき、私がやりたいことの 1 つは、ユーザーが有効な電子メール アドレスを送信したことを確認するために確認電子メールを送信することです。そこで、ある種のマジック トークンを含む URL をユーザーに送信するようにメーラーを設定し、送信したメールをユーザーが受信したことを証明しました。電子メールの本文の URL は、ルーティング ヘルパー メソッド (この場合はverify_url("a1b2c3")) を介して生成され、URL は次のように適切に電子メールに詰め込まれます。

http://localhost:3000/verify/a1b2c3

これはすべて、localhost:3000問題なくうまく機能します。そのため、責任ある開発者として、次に行うことは、アプリをリモート QA 環境に移動し、すべてが引き続き機能することを確認することです。私のホスティング プロバイダーは Passenger を使用しており、次のように QA 環境にアクセスできるようにセットアップしています。

http://my.url/qa

/qaこれを行うには、適切なファイルでRailsBaseURI を に設定し.htaccessます。そのため、QA 環境でサイトに登録しようとしています。ヘルパー メソッドverify_urlが次の URL を生成することを期待しています。

http://my.url/qa/verify/a1b2c3

しかし、これは私が代わりに得るものです:

http://my.url/verify/a1b2c3

「qa」パスへの参照が明確に欠けていることに注意してください。答えを探してさまざまなブログやマニュアルを調べたところ、次の提案がありました。

  • などの環境変数を設定します。ENV['RAILS_RELATIVE_URL_ROOT']
  • ActionController::Base.relative_url_root私の中で設定environment/qa.rb
  • my にマップを追加してconfig.ru、特定のパスでアプリを初期化します
  • ルートをスコープにラップする

ただし、これらはそれぞれ非推奨 (最初の 2 つのオプション) であるか、次のように冗長なパス情報 (2 番目の 2 つのオプション) を生成することになるようです。

http://my.url/qa/qa/verify/a1b2c3

verify_url("a1b2c3")を呼び出すときに、QA 環境の相対パスを含む適切な URL を実際に取得するように、これを設定する適切な方法を誰か教えてもらえますか? environments/qa.rb理想的には、ある環境から次の環境に移動するときにアプリをまったく変更する必要がないように、これを何らかの方法で設定できるようにしたいと考えています。

前もって感謝します!

4

2 に答える 2

2

全体を却下し/qa/、ステージングを次のようなサブドメインに移動しhttp://qa.my.url/ます。そうしないと、本番環境に悪影響を与える可能性のあるコードを変更する必要があります。

アップデート

あなたがメールでこれらのルートを使用したかったという事実を無視しました。この場合:host、url ヘルパーで次のように設定する必要があります。

verify_url(:id=>"a1b2c3", :host=>"qa.my.url")

本番環境に入った後に行う必要がある変更の量を減らすために、イニシャライザで定数を定義することをお勧めします (in /path/to/app/config/initializers/my_host.rb):

MY_HOST = 'qa.my.url'

その後、次verify_urlのようにメール テンプレートを呼び出すことができます。

verify_url(:id=>"a1b2c3", :host=>MY_HOST)

本番環境に入ったら、MY_HOST定数を変更すれば、テンプレートについて心配する必要はありません。

私の見解では、この問題を回避するため*_urlだけにヘルパーを使用することはありません。*_path

于 2011-05-10T07:05:59.337 に答える
0

ActionMailer のドキュメントに少し時間を費やした後、少なくとも私が達成しようとしているものについては、さらに簡単な解決策があることがわかりました。Wkerplank は間違いなく私の質問に答えてくれましたが、私は正しい質問をしていなかったようです。:-)

完全修飾 URL を実際に表示する必要があるのは、メーラー内で作業しているときだけですよね? それ以外の場合、パスは問題なく機能します。さて、ActionMailer では、環境ごとにデフォルトの URL オプションを指定できることがわかりました。私のenvironments/development.rb構成ファイルには、次のものが含まれています。

config.action_mailer.default_url_options = { :host => 'localhost:3000' }

QA 環境に移行するときは、Passenger に QA から実行していることを伝える必要があり、次のような構成が必要ですenvironments/qa.rb

config.action_mailer.default_url_options = { :host => 'qa.my.url' }

そうすれば、環境間でコードを少し変更する必要がないため、実行しているドメイン、サブドメイン、またはポートが何であるかは本当に気にしません...それはうまくいきます。これが将来誰かに役立つことを願っています。ありがとう!

于 2011-05-12T02:50:36.947 に答える