名为route的路线放置'。'而不是' /'在URL上进行更新

时间:2017-03-13 22:05:05

标签: ruby-on-rails

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

更新#2 ......它不是复数,因为它被单独调用,如下所示&删除指定的路由会自动纠正所有问题。

更新#1 ...找到理由为什么没有人在URL中列出斜线代替斜线...它是unix名词,而不是英文... IE:如果你搜索' dot& #39;代替'。',然后你得到各种答案。

我被这一个弄乱了......前几天做了我的第一条命名路线,一切看起来都很棒,直到突然看来编辑页面从指定路线调用时没有正确更新,错误...

No route matches [PATCH] "/dash.6"

删除指定路线将我带回正常路线&所有选项都有效。我无法找到使用''的路由。而不是' \',所以我迷失了。我的路线文件低于&然后路由来自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

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

我的表单是生成的标准轨道&每当我删除命名路线时都可以工作...... edit.html.haml渲染_form partial ...

%h1 Editing dash

= render 'form'

= link_to 'Show', @dash
\|
= link_to 'Back', dashes_path

_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

1 个答案:

答案 0 :(得分:2)

正如this question中所述,通常问题是当您在集合(复数)和成员(单数)控制器操作之间混淆时。

集合控制器操作是一个没有ID的操作,因为它不操作现有资源(dash),或者因为它适用于一组资源。 RESTful集合操作包括:indexnewcreate。他们每个人都有一个辅助方法和一个"动词" (方法):

  • indexurl: dashes_path, method: :get(方法get是默认值)
  • createurl: dashes_path, method: :post
  • newurl: new_dash_path, method: :get

请注意indexcreate如何共享相同的复数网址帮助方法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以外的所有其他操作,使用相同的单数网址帮助方法dash_path(@dash)

您可以在in the guides找到更多详细信息。

现在,"点而不是斜线"症状是指您错误地尝试以应该用于集合操作的方式指向成员操作。所以,如果你尝试dashes_path(@dash) - 那就没有了。 dashes_path接受的唯一参数是format,它会在点后添加到最后的网址中,这就是为什么您会看到{{1}这样奇怪的网址的原因}。

Rails表单构建器/dash.6form_for等扩展需要决定是否将表单操作指向simple_form_for集合操作(​​呈现#create集合操作时)或#new成员操作(呈现#update成员操作时)。他们这样做了#34;神奇地"通过查看您执行#edit时给出的对象。如果simple_form_for(@dash)为真,则他们会将表单操作指向@dash.new_object?,如果结果为假,则会将其指向#create

在你使用它的情况下"开箱即用"一切都很好。当您将此行添加到#update

时,它就开始对您采取行动
routes.rb

默认情况下,get 'dash', to: 'dashes#show' 成员操作,而不是集合操作。它必须收到一个ID。我认为这就是为什么Simple Form会对你起作用的原因。而不是那个别名,试试这个:

show

如果这样可以解决问题,请告诉我们。

总的来说,我建议"使用" RESTful路由然后"反对"他们。很少需要在get 'dash/:id', to: 'dashes#show' 中添加命名路由。也有例外情况,但我认为在您的情况下偏离惯例并尝试使用routes.rb而不是dash/1是合理的。 "使用" Rails将为您提供众所周知的生产力提升,而不是"反对"通过尝试强制它来获得像这样的相对较小的细节。