【问题标题】:Custom Routing in Rails 5Rails 5 中的自定义路由
【发布时间】:2019-07-26 13:18:34
【问题描述】:

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

所以而不是:

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

【问题讨论】:

  • 能否请您发布整个routes.rb 文件?
  • 确保任何两条路线都不应该相同。如果您特定于此,则使用一些前缀更改管理路由。

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


【解决方案1】:

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

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

【讨论】:

  • 这没有帮助,如果我了解它的工作原理,我只会自己参考文档。我正在寻找一些实际的代码示例指南。正如我所说,路由不是我在尝试使用我发现自己的信息失败后掌握的东西
  • 根据文档,如果您不希望您的控制器(或其他任何东西)包含在您的 URL 中,您可以通过执行以下操作从您的路径中省略:path: ''
【解决方案2】:

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

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

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

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

【讨论】:

  • 但我怎样才能访问管理员?这是我最大的问题是/admin 被选为潜在的事件 ID
  • 把我提到的放在最后一行。在您可以放置​​其他路线之前。所以它会喜欢一个默认路由。
  • get '/account', to: 'account#index' ... get '/(*all)', to: 'home#app'
【解决方案3】:

(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

【讨论】:

  • 感谢@s3tjan,这很接近。所以我正在使用带有friendly_id的蛞蝓。我仍然在访问管理员时遇到问题。它将管理路径 (my.site.com/admin) 指向 events_controller 中的 set_event 方法。有什么想法吗?
  • 请发布您的routes.rb 文件,我认为可能与:namespace 有关
  • 我似乎无法让它工作。你能举个例子说明你将如何使用约束来让/admin 走上正确的道路吗?
  • @JollyGreenGiant 我更新了我的答案,试试看。告诉我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 2015-04-26
  • 2011-01-17
  • 1970-01-01
  • 2011-01-27
相关资源
最近更新 更多