将非匹配的子域重定向到root

时间:2013-06-04 21:56:05

标签: ruby-on-rails

我或多或少地实现了这个railscast来获取子域名:

http://railscasts.com/episodes/221-subdomains-in-rails-3

效果很好,但我希望不匹配的子域重定向到根路径。

这是routes.rb部分:

match '/' => 'menus#show', constraints: { subdomain: /^(?!www$)(.+)$/i }

这是菜单#show:

# GET /menus/1
# GET /menus/1.json
def show
  if !params[:id].nil?
    @menu = Menu.find(params[:id])
  else
    if Shop.find_by_subdomain(request.subdomain).nil?
        respond_to do |format|
          format.html { redirect_to(root_path, :notice => I18n.t("misc.not_found")) }
          return
        end
      else
       @menu = Shop.find_by_subdomain(request.subdomain).menus.last
    end
  end

  if !@menu.nil?
    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @menu }
    end
  end
end

所以我仍然希望保留不使用子域的可能性(因此检查params [:id]。然后我检查子域是否存在,如果不是我想重定向。

目前我在尝试使用非现有域名时会收到此信息,因此我相信他仍在尝试显示菜单:

undefined method `shop' for nil:NilClass
Extracted source (around line #1):

1: <h2>Menu <%= @menu.shop.name %></h2>
2: <br>
3: <%= render :partial => 'menu_show' %>

1 个答案:

答案 0 :(得分:0)

在ApplicaitonController中,执行以下操作:

before_filter :redirect_on_bad_subdomain

def redirect_on_bad_subdomain
  unless is_valid_subdomain(request.domain)
    redirect_url = root_url(subdomain: 'www')
    redirect_url += request.fullpath[1..request.fullpath.length]
    redirect_to redirect_url and return false
  end
end

def is_valid_subdomain(subdomain) 
  # validate however you want
end

我还没有测试出确切的代码,但这应该非常接近。