2

私はこれをroutes.rbファイルに持っています:

class SubdomainWww
  def self.matches?(request)  
    request.subdomain.start_with? "www."
  end

  def self.strip_www(subdomain)
    if subdomain.start_with? "www."
      subdomain.slice!(4..-1) 
    else
      subdomain
    end
  end
end

MyApp::Application.routes.draw do

  constraints(SubdomainWww) do
    match '*path', :to => redirect(:subdomain => SubdomainWww.strip_www(???))  
    match '/', :to => redirect(:subdomain => SubdomainWww.strip_www(???))  
  end
...

これの目的は、www を削除することです。サブドメインの場合 (たとえば、www.sub.domain.tld は sub.domain.tld にリダイレクトする必要があります。サブドメインは後でクライアントを識別するために使用されます)。「???」を置き換えるにはどうすればよいですか 現在のリクエストのサブドメイン(文字列)が関数 strip_www() に渡されるようにするには?

前もって感謝します!

4

1 に答える 1

0

これが機能するかどうかはわかりませんが、Devise で Cells を使用する場合と同じ問題がありました。Devise の current_* メソッドは、リクエストに格納されている env と warden を必要とします。セルのビューをレンダリングするセル (コントローラーとビュー) へのルートがありました。セルのコントローラーにリクエストを取得する方法は、route.rb からのリクエストとして self を渡すことでした。

match "/dashboard/widget/:name" => proc { |env|
  cell_name = env["action_dispatch.request.path_parameters"][:name]
  [ 200, {}, [ Cell::Base.render_cell_for(cell_name, :display, :request => self) ]]
}

:request => self に注意してください。ルートにいる場合、self は ActionDispatch::Request オブジェクトそのものです。リクエストを渡すだけで、うまくいくはずです。

MyApp::Application.routes.draw do

  constraints(SubdomainWww) do
    match '*path', :to => redirect(:subdomain => SubdomainWww.strip_www(self))  
    match '/', :to => redirect(:subdomain => SubdomainWww.strip_www(self))  
  end
...
于 2012-04-19T00:10:07.103 に答える