0

Rails 3 のサブドメインに関する Railscast/Asciicastを見たり読んだりしたことがあるかもしれません。親 (この記事では「ブログ」) が見つからない場合のアプリケーションの動作を実装する方法について、ベスト プラクティスについて質問してください。説明させてください。

blog1.example.com/articles # it's normal situation
example.com/articles # abnormal situation. 

2 番目の例では、ブログは見つかりませんが、記事のルートは引き続き利用できます。私は知っています、私はこのようなものを使うことができます...

def rescue_action(exception)
  case exception
    when ActiveRecord::RecordNotFound
      return redirect_to blogs_path, :status => :moved_permanently
  end
  super
end 

...しかし、それは「レールウェイ」ですか?これに関するアイデア/コメントはありますか?

4

1 に答える 1

0

この場合、サブドメインまたはサブドメインなしに基づいてルーティングを制限しました。その場合、サブドメインでのみ機能するルートを簡単に作成でき、誰かがサブドメインなしで同じルートにアクセスしようとすると、ルーティング エラー (404) が発生します。

たとえば、次のようになります。

ルート.rb

Backend::Application.routes.draw do

  constraints AppDomainRoutes.new do

    # signup paths
    get   "/signup" => "accounts#new", as: "signup"
    post  "/signup" => "accounts#create", as: "signup"

    # root
    root to: "accounts#new"
  end

  constraints AccountDomainRoutes.new do

    # password reset paths
    get   "/reset_password/:password_reset_token" => "reset_passwords#edit", as: "reset_user_password"
    put   "/reset_password/:password_reset_token" => "reset_passwords#update", as: "reset_user_password"

    # websites
    resources :websites

    # root
    root to: "websites#new"
  end

  # request password reset paths
  get   "/reset_password" => "reset_passwords#new", as: "reset_password_request"
  post  "/reset_password" => "reset_passwords#create", as: "reset_password_request"

  # login paths
  get "/login"   => "sessions#new",      as: "login"
  post "/login"  => "sessions#create",   as: "login"

  # logout paths
  get "/logout"    => "sessions#destroy",  as: "logout"
  delete "/logout" => "sessions#destroy",  as: "logout"


end

そして、lib/routes で:

app_domain_routes.rb

class AppDomainRoutes
  def matches?(request)
    request.subdomain.blank? || request.subdomain == "www"
  end
end

account_domain_routes.rb

class AccountDomainRoutes
  def matches?(request)
    request.subdomain.present? && request.subdomain != "www"
  end
end

現在、/signupメイン アプリケーション ドメインwww.mydomain.com または mydomain.comからの/websites/newみアクセスでき、*.mydomain.comからのみアクセスできます。ただし/login、便宜上、両方の状況で引き続きアクセスできます。

明らかに、実際にはデータベース内のアカウントではないinvalid.mydomain.com場合、これは訪問の問題を解決しません。invalid

このために、次のように に戻り、application_controller.rbそこでリダイレクトを処理します。

application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :redirect_unknown_account

  private

  # returns current subdomain (account.subdomain) or nil
  def account_subdomain
    @account_subdomain ||= request.subdomain if request.subdomain.present? && request.subdomain != "www"
  end

  def current_account
    @current_account ||= Account.find_by_username(account_subdomain) if account_subdomain
  end

  def redirect_unknown_account
    if account_subdomain && ! current_account
      redirect_to signup_url(host: app_domain), alert: "This account does not exist."
    end
  end

  def account_domain
    @account_domain ||= "#{current_account.username}.#{app_domain}" if current_account
  end

  def app_domain
    @app_domain ||= "mydomain.com"
  end

end
于 2011-08-12T09:37:38.247 に答える