名为 route 的 rails puts '.' 而不是更新时 URL 中的“/”

Mir*_*att 2 ruby-on-rails

更新#3 ...固定!解决方案是将新的名称空间代码 ( get 'dash', to: 'dashes#show') 移至该root "campaigns#index"条目正上方的 routes.rb 文件底部。

更新#2 ...它不是复数形式,因为它被称为单数,如下所示,删除命名路由会自动更正所有问题。

更新 #1 ... 找到了为什么没有人在 URL 中列出句点代替斜杠的原因 ... 它是 unix 名词,而不是英语 ... IE:如果你搜索 'dot' 代替 '.',那么你得到各种答案。

我对这个感到困惑......前几天做了我的第一个命名路由,一切看起来都很棒,直到突然出现从命名路由调用时的编辑页面没有正确更新,出现错误......

No route matches [PATCH] "/dash.6"
Run Code Online (Sandbox Code Playgroud)

删除命名路线使我回到正常路线和所有选项工作。我找不到提及使用 '.' 的路由。而不是'\',所以我迷路了。下面是我的路由文件,然后是来自 rails 服务器的路由结果......

Rails.application.routes.draw do

  devise_for :users, controllers: { sessions: 'users/registrations' }

  # map.login '/login', :controller => 'sessions', :action => 'new'  ## 3rd try
  # get '/dash', :controller => 'dashes', :action => 'show'  ## 2nd try
  # get 'dash', to: 'dashes#show'  ## Original named route

  resources :dashes
  resources :campaigns
  resources :players
  resources :countries

  root "campaigns#index" 

  # yank later
  resources :neighborhoods
end
Run Code Online (Sandbox Code Playgroud)

服务器上的 Rails 结果...

Paths Matching (dashes):
dashes_path     GET     /dashes(.:format)   

dashes#index
    POST    /dashes(.:format)   

dashes#create
Paths Containing (dashes):
dashes_path     GET     /dashes(.:format)   

dashes#index
    POST    /dashes(.:format)   

dashes#create
new_dash_path   GET     /dashes/new(.:format)   

dashes#new
edit_dash_path  GET     /dashes/:id/edit(.:format)  

dashes#edit
    GET     /dashes/:id(.:format)   

dashes#show
    PATCH   /dashes/:id(.:format)   

dashes#update
    PUT     /dashes/:id(.:format)   

dashes#update
    DELETE  /dashes/:id(.:format)   

dashes#destroy
Run Code Online (Sandbox Code Playgroud)

我的表单是标准的 rails 生成并在我删除命名路由时工作......edit.html.haml呈现 _form 部分......

%h1 Editing dash

= render 'form'

= link_to 'Show', @dash
\|
= link_to 'Back', dashes_path
Run Code Online (Sandbox Code Playgroud)

_form.html.haml

  = simple_form_for(@dash) do |f|
  = f.error_notification

  .form-inputs
    = f.input :name
    = f.association :user
    = f.association :dashcampaigns
    = f.association :dashplayers

  .form-actions
    = f.button :submit
Run Code Online (Sandbox Code Playgroud)

Ami*_*itA 5

本问题所述,通常问题在于您混淆了集合(复数)和成员(单数)控制器操作。

一个集合控制器动作是,没有一个ID,因为它不处理现有的资源(动作dash),或者因为它可以在一组资源。REST风格的收集行动是:indexnew,和create。他们每个人都有一个辅助方法和一个“动词”(方法):

  • index:(url: dashes_path, method: :get方法get是默认的)
  • createurl: dashes_path, method: :post
  • newurl: new_dash_path, method: :get

注意如何既indexcreate共享相同的多个URL helper方法dashes_path。只有method选项可以区分它们。

构件控制器动作是具有它正在操纵资源(一个特定的ID的动作dash)。RESTful 收集操作是:

  • editurl: edit_dash_path(@dash), method: :get
  • showurl: dash_path(@dash), method: :get
  • updateurl: dash_path(@dash), method: :patch
  • destroyurl: dash_path(@dash), method: :destroy

看看除了edit所有其他操作如何使用相同的单一URL 帮助程序方法dash_path(@dash)

您可以在指南中找到更多详细信息。

现在,“点而不是斜线”的症状是当您错误地尝试以应该用于集合操作的方式指向成员操作时。因此,如果您尝试这样做- 没有这样的事情。唯一接受的参数是,它被添加到 URL 的最后一个点之后,这就是为什么你会看到一个奇怪的 URL,例如.dashes_path(@dash)dashes_pathformat/dash.6

Rails 表单生成器form_for和扩展等simple_form_for需要决定是将表单动作指向#create集合动作(渲染#new集合动作时)还是#update成员动作(渲染#edit成员动作时)。当您这样做时,他们会通过查看您给他们的对象来“神奇地”这样做simple_form_for(@dash)。如果@dash.new_object?为真,则将表单操作指向#create,如果为假,则将其指向#update

就您而言,当您“开箱即用”使用它时,一切都很好。当您将此行添加到您的routes.rb:

get 'dash', to: 'dashes#show'
Run Code Online (Sandbox Code Playgroud)

默认情况下show成员操作,而不是集合操作。它必须收到一个 ID。我认为这就是 Simple Form 对你采取行动的原因。而不是那个别名,试试这个:

get 'dash/:id', to: 'dashes#show'
Run Code Online (Sandbox Code Playgroud)

如果这能解决问题,请告诉我们。

总的来说,我建议“使用”RESTful 路由而不是“对抗”它们。很少需要在routes.rb. 有例外,但我认为在您的情况下偏离约定并尝试使用dash/1而不是dashes/1. “与”Rails 一起工作将使您获得众所周知的生产力提升,而不是通过试图强迫它处理诸如此类的相对较小的细节来“反对”它。