【问题标题】:Routes conflict in Ruby on RailsRuby on Rails 中的路由冲突
【发布时间】:2017-12-13 13:32:06
【问题描述】:

我正在使用Devise gem 并为用户创建了一个show 页面。我的想法是创建一个像www.website.com/:id 这样的简单路径,我将其配置如下:

  devise_for :users, path: '', path_names: {sing_in: "login", sing_out: 
     "signout", sing_up: "signup", edit: "edit"}, 
     :controllers => {:registrations => :registrations }
  resources :users, only: [:show]
  get '/:id' => 'users#show', as: :profile

我的路线运行良好,但除了show 页面之外,我在static controller 下还有页面,例如about 页面。我希望能够像www.website.com/about 一样访问它,这是我定义我的static routes 的方式:

get '/about', to: 'static#about'

现在,如果我尝试重定向到 about page,我会收到错误消息:

ActiveRecord::RecordNotFound in UsersController#show
Couldn't find User with 'id'=about

这是我的users_controller.rb

class UsersController < ApplicationController

  def show
    @user = User.find_by_id(params[:id])
    @services = @user.services
  end

  ...
end

我试图搜索类似的错误,但没有找到类似的错误。有人可以告诉我我做错了什么吗?

感谢您的帮助和时间。

【问题讨论】:

  • 你的路由get '/about', to: 'static#about'应该在`get '/:id' => 'users#show'之前定义,如::profile`路由
  • 假设您期望用户呼叫中的数字和静态页面呼叫中的字母,您可以使用约束:guides.rubyonrails.org/routing.html#specifying-constraints
  • @lightalloy 这是我的第一个想法,但它不起作用,因为正如作者所写的那样,它实际上是对静态页面控制器的调用。
  • @MarekLipka 谢谢你的回答。如果我想将数值添加到其他页面(例如:www.website/123)上的字母怎么办?有没有其他类似的解决方案?
  • 路由从上到下匹配。 @lightalloy 的建议对你不起作用吗? guides.rubyonrails.org/routing.html

标签: ruby-on-rails devise routes ruby-on-rails-5.1


【解决方案1】:

这里有两件事:

  • 路由不知道参数类型
  • 路由从上到下匹配

在这种情况下,我怀疑您的单级路由被定义为您的get '/:id' 路由。因此,该路由捕获了所有/anything 的请求,因为路由器认为anything 是一个参数。

只需将您的路由定义移动到任何其他 /about 等路由下方,以便它们首先匹配。

像这样:

get '/about', to: 'static#about'
get '/:id' => 'users#show', as: :profile

【讨论】:

  • 添加了一个代码示例,也很高兴知道@AnthonyBrooks 您需要添加验证以防止用户具有与任何已定义路由相同的 id/slug/name;这将防止用户感到沮丧(以防万一有人尝试输入“关于”作为他们的用户名;-))
  • @RudolfOlah 哇,我还没想过……好点子!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多