没有路线匹配{:action => “show”...}而params [:action]返回“edit”

时间:2013-08-30 10:17:04

标签: ruby-on-rails

就像在标题中一样,我在控制器中进入edit动作时遇到了奇怪的问题。当我试图得到,错误是

ActionController::UrlGenerationError at /pages/header/foo/edit
No route matches {:action=>"show", :controller=>"pages", :menu=>#<Page id: 1, title: "tytul", slug: "foo", name: "kupa", position: 1, created_at: "2013-08-27 12:46:26", updated_at: "2013-08-30 07:57:58", menu: "header">, :id=>nil, :format=>nil} missing required keys: [:id]

我认为它可能与使用路径定义资源的routes.rb文件相关联:

resources :pages, path: "pages/:menu" 

所以,当我输入例如www.example.dev/pages/forum/interesting_topic时,我得到了正确的回复,行动show@page = interesting_topic (and :menu = "forum")。 但另一方面www.example.dev/pages/forum/interesting_topic/edit让我想到上面的错误。这真的很奇怪,因为我的参数看起来像这样:

{"action"=>"edit", "controller"=>"pages", "menu"=>"forum", "id"=>"interesting_topic"}

如果我有正确的行动edit,并且仍然会收到有关行动show的错误? (也许值得一提的是better-errors最后一个申请页面,是我需要的,意思是形式,让它变得更加奇怪)

EDIT 耙路线

sort_pages GET    /pages/:menu/sort(.:format)                 pages#sort
    save_order_pages POST   /pages/:menu/save_order(.:format)           pages#save_order
               pages GET    /pages/:menu(.:format)                      pages#index
                     POST   /pages/:menu(.:format)                      pages#create
            new_page GET    /pages/:menu/new(.:format)                  pages#new
           edit_page GET    /pages/:menu/:id/edit(.:format)             pages#edit
                page GET    /pages/:menu/:id(.:format)                  pages#show
                     PATCH  /pages/:menu/:id(.:format)                  pages#update
                     PUT    /pages/:menu/:id(.:format)                  pages#update
                     DELETE /pages/:menu/:id(.:format)                  pages#destroy

第二。修改

因为我删除了“编辑”视图部分呈现的所有内容,它突然开始工作,我在这里给出了编辑操作

= simple_form_for @page do |f|
  .inputs
    = f.input :title
    = f.input :slug
    = f.input :name
  .actions
    =f.button :submit

和控制器

before_filter :set_page, only: [:edit, :update, :destroy]

def edit
end

 private

  def set_page
    @page = Page.find_by_slug!(params[:id])
  end 

2 个答案:

答案 0 :(得分:0)

检查终端窗口中的服务器日志 - 您可能在编辑视图中显示指向展示页面的链接无效。

编辑:哦,我知道,这是一个路由问题。由于路由中有一个额外的变量(:menu以及:id),因此在定义表单时需要提供额外的变量。

尝试以下方法(如果菜单应该等于'论坛')

= simple_form_for :forum, @page do |f|

(其余部分保持不变)

答案 1 :(得分:0)

将simple_form表单更改为此对我有用:

= simple_form_for @page, url: @page.new_record? ? pages_path(params[:menu]) : page_path(params[:menu], @page)