Rails 5中的自定义路由

时间:2019-03-05 06:23:21

标签: ruby-on-rails routing ruby-on-rails-5 url-routing

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

所以而不是:

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

3 个答案:

答案 0 :(得分:0)

通过“路线”可以指定路由URL的外观:

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

(1)要固定/admin到正确的路径,请将namespace行移到事件资源的上方,以便首先匹配:

  

按指定的顺序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

提示:要获取可用路由的完整列表,请在终端机5.1 Listing Existing Routes中使用rails routes