当我试图为每个用户创建subodmain时,我编码如下:
在下面的控制器中,我正在检查设计页面中sign_In的子域是否属于user.rb表中的用户。如果没有,我将注销。
class ApplicationController < ActionController::Base
before_action :authenticate_user!
before_action :check_domain
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:slug])
devise_parameter_sanitizer.permit(:account_update, keys: [:slug])
end
def check_domain
unless current_user.nil?
@domain = User.find_by(email: current_user.email)
if @domain.slug != request.subdomain
sign_out_and_redirect(current_user)
flash.alert = "User not found."
end
end
end
end
此时此刻,我有如下路线.rb:
Rails.application.routes.draw do
resources :devise
resources :places
resources :people_items
resources :people, only: [:edit, :update]
resources :gift_items
resources :gifts, only: [:edit, :update]
resources :program_items
resources :story_items
devise_for :users
root to: 'pages#index'
get '/home', to: 'output#home'
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
resources :pages do
member do
delete :delete_file
end
end
resources :stories, only: [:edit, :update]
resources :programs, only: [:edit, :update]
resources :galleries, only: [:edit, :update] do
member do
delete :delete_image
end
end
get 'informations/information'
resources :aboutus, only: [:edit, :update]
end
我在config/environments/development.rb 中又修改了一个设置
config.action_dispatch.tld_length = 1
一切都很好。
在教程中,我发现为了正确处理子域,我应该修改routes.rb如下。但下面修改文件的目的是什么?我真的需要触摸routes.rb吗?这是我的问题。
constraints subdomain: /.*/ do
resources :pages
end
我真的需要修改吗?或者这次修改的目的是什么?这真的有必要吗?
非常感谢您的建议!
routes.rb
中的约束允许您限制路由何时应该匹配或不应该匹配,如果不匹配,则返回404。
你可以在每条路线的基础上为参数这样做:
get 'products/:category', to: "products#index", category: /(fruit|electronics|medicine)/, as: :products
这将允许对http://yourdomain.com/products/fruit
的请求,但不允许对http://yourdomain.com/products/vehicles
的请求。访问任何被禁止的域将为您提供404响应。
您可以通过将一组不同的路由封装在约束块中来为它们提供通用约束,如下所示:
constraints ->(req) { Site.exists?(subdomain: req.subdomain) } do
resources :articles, path: "blog", only: [:index, :show]
...
end
因此,在这里,我们检查Site
记录是否存在提供的子域。如果没有,我们返回404。