Rails中的自定义路由5

问题描述 投票:0回答:3

我在自定义路由方面遇到了一些问题。我要做的是从路由中删除模型并动态使用记录名称。

而不是:

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
ruby-on-rails routing ruby-on-rails-5 url-routing
3个回答
0
投票

Rails允许您指定路由URL的外观:

https://guides.rubyonrails.org/routing.html#translated-paths


0
投票

您不需要重定向。您需要将所有请求与一个控制器/操作匹配。

get '/(*all)', to: 'home#app'

在此操作中,检查params中的内容并呈现适当的视图。

PS:它会捕获所有请求,即使是未找到的图像,js等。


0
投票

(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

© www.soinside.com 2019 - 2024. All rights reserved.