我在自定义路由方面遇到了一些问题。我要做的是从路由中删除模型并动态使用记录名称。
而不是:
site.com/events/my-event
我希望它是:
site.com/my-event
我讨厌使用下面的代码,唯一的问题是我无法访问我的管理命名空间,因为它被视为事件记录(和任何其他路由):
get('/:id', to: redirect do |params, request|
id = request.path.gsub("/", "")
"/events/#{id}"
end)
我知道这个重定向是不对的,我只是不太精通路由选项。该如何正确完成?
的routes.rb
Rails.application.routes.draw do
resources :events, param: :id, path: "" do
get 'login', to: 'sessions#new', as: :login
get 'logout', to: 'sessions#destroy', as: :logout
post 'sessions', to: 'sessions#create', as: :session_create
end
namespace 'admin' do
root "events#index"
resources :sessions, only: [:create]
get 'login', to: 'sessions#new', as: :login
get 'logout', to: 'sessions#destroy', as: :logout
resources :events
end
end
Rails允许您指定路由URL的外观:
https://guides.rubyonrails.org/routing.html#translated-paths
您不需要重定向。您需要将所有请求与一个控制器/操作匹配。
get '/(*all)', to: 'home#app'
在此操作中,检查params中的内容并呈现适当的视图。
PS:它会捕获所有请求,即使是未找到的图像,js等。
(1)要修复/admin
以转到正确的路径,将namespace
线移动到事件资源上方,以便首先匹配:
Rails路由按照指定的顺序匹配2.2 CRUD, Verbs, and Actions
# routes.rb
namespace :admin do
root "events#index"
#...
resources :events
end
resources :events, param: :name, path: ""
使用:param
和:path
来匹配site.com/myevent
而不是site.com/events/:id
你的events
控制器:
# events_controller.rb
class EventsController < ApplicationController
# ...
private
def set_event
@event = Event.find_by(name: params[:name])
end
end
你的admin events
控制器:
# admin/events_controller.rb
class Admin::EventsController < ApplicationController
# ...
private
def set_event
@event = Event.find params[:id]
end
end
提示:要获得可用路线的完整列表,请在终端中使用rails routes
5.1 Listing Existing Routes