Rails model_path路由错误,没有路由匹配" model.2&#34 ;;应该是" model / 2"

时间:2018-01-31 14:43:31

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

我的路由路径似乎有问题。通常我应该能够做<%= link_to Profile, user_path(@user||current_user) %>这样的事情,然后继续我的一天。无论出于何种原因,我都没有理解我的user_path没有像我期望的那样返回/user/:id。而是返回/user.:id 为了测试这个,我用以下代码加载了一个部分。

应用/视图/用户/ _test.html.rb

<%= @user %><br>
<%= @user.id %><br>
<%= link_to user_path(@user), user_path(@user) %><br>
<%= new_user_path %><br>
<%= edit_user_path(@user) %><br>
<%= url_for(@user) %>

此返回

本地主机:3000 /测试

#<User:0x007fb6cd341f08>
1
/user.1
/users/new
/users/1/edit
/user.1

我无法弄清楚导致这种情况发生的原因。 edit_user_path(@user)效果很好,但节目没有。我已经从上到下阅读过Rails Routing Guide三次,我无法弄明白。我发现问题的最接近的是old Rails 3.1 gem problem with Devise,但我甚至没有使用Devise宝石(也许我应该是?)。

为什么我的路线失败了?我并不是真的在寻找一种解决方法(虽然我认为我宁愿有一个解决方法而不是没有解决方案),我想了解为什么会发生这种情况并修复它。发生了什么事?

我的路线非常香草,没什么特别的,但为了防止问题出现而我错过了,这就是它。

配置/ routes.rb中

Rails.application.routes.draw do

  root 'static#home'

  %w( 404 406 422 500 503 ).each do |code|
    get code, :to => "errors#show", :code => code 
  end 

  #USER PAGES
  get '/test' => 'users#test'
  get '/signup' => 'users#new'
  post '/user' => 'users#create'
  get '/user/list' => 'users#index'
  post '/user/' => 'users#update'
  get '/user/:id' => 'users#show'
  get 'profile', to: 'users#show'

  resources :users
end

2 个答案:

答案 0 :(得分:1)

我建议按以下方式更新您的路线:

<强>配置/ routes.rb中

Rails.application.routes.draw do

  root 'static#home'

  %w( 404 406 422 500 503 ).each do |code|
    get code, :to => "errors#show", :code => code 
  end 

  #USER PAGES
  get '/test' => 'users#test'
  get 'profile', to: 'users#show', as: :user_profile

  resources :users
end

...因为resources :users创建了我删除的所有路线。

重复项可能已覆盖默认路径,导致您看到的行为 - 如果您将对象传递给不期望参数的url助手,您会看到您正在获得的行为(即{{ 1}})。

我还在用户个人资料路径中添加了一个名称,以避免这种冲突。看看是否有效(可能一次只能找到原因和结果) - 否则,请尝试暂时删除配置文件路径。

重新启动该路径,您可能会遇到一个问题:doesnt_have_an_id_path(@object) => /doesnt_have_an_id.1操作需要users#show参数,但该路由不允许使用:id参数。这个可能导致当前问题,但如果不是,可能会导致问题。

希望能解决这个问题 - 如果您在尝试时有任何问题/反馈,请大声说出来。

答案 1 :(得分:1)

在您的情况下,两条相互矛盾的路线是:

post '/user/' => 'users#update'
get '/user/:id' => 'users#show'

您正在尝试使用user_path辅助方法,因此您需要user命名路由。 如果你为这两条路线运行rake routes,你会看到:

Prefix Verb URI Pattern         Controller#Action
  user POST /user(.:format)     users#create
       GET  /user/:id(.:format) users#show

Prefix列显示为您的应用程序定义的命名路由。在这种情况下,Rails为POST user端点自动生成命名路由/user。这意味着user_path将返回/用户,而不是您预期的/user/:id。当Rails看到没有参数的路由定义时,会生成这样的路由。例如,如果您的路线中有get /user/some/more,则Rails会为您自动生成命名路线user_some_more,您可以使用user_some_more_path帮助。

为了修复您的特定情况,您可以通过执行以下操作来阻止rails为POST端点生成路由:post '/user/', as: nil并为GET端点提供您想要的名称:get '/user/:id', as: 'user'。然后,您将能够使用user_path(user)生成格式/ user /:id。

的路径