没有路由匹配{:action =>" show",:controller =>" posts"}缺少必需的密钥:[:id]

时间:2015-12-17 00:26:17

标签: ruby-on-rails ruby model-view-controller

我在 _form <%= simple_form_for(@post, url: blog_path) do |f| %>中遇到了这一行,这给了我错误:

No route matches {:action=>"show", :controller=>"posts"} missing required keys: [:id]

请记住,在我的路线中,我有:resources :blog, controller: 'posts',也就是说我正在处理MVC的帖子,但我希望/ posts /被替换为/博客/路线。

posts_controller

  def new
    @post = Post.new
  end

  def edit
  end

当我转到edit时_form工作,但不能创建new

路由

           blog_index GET    /blog(.:format)                                                     posts#index
                      POST   /blog(.:format)                                                     posts#create
             new_blog GET    /blog/new(.:format)                                                 posts#new
            edit_blog GET    /blog/:id/edit(.:format)                                            posts#edit
                 blog GET    /blog/:id(.:format)                                                 posts#show
                      PATCH  /blog/:id(.:format)                                                 posts#update
                      PUT    /blog/:id(.:format)                                                 posts#update
                      DELETE /blog/:id(.:format)                                                 posts#destroy

3 个答案:

答案 0 :(得分:2)

model_path默认情况下,Rails中的路由逻辑导致blog#show =&gt; /blogs/:id

将其更改为blogs_path

看着你的路线,我看到明显的命名冲突,你必须定义路线错误。

确保它看起来像resources :posts, :as=>"blogs",都是复数。

<强> UPD 如果你想只有一个博客,那么resource :post, :as=>"blog",都是单数。

但这意味着一个实际的输入。我很确定你会谈到blog/post1blog/post2,否则我称其为博客时没有任何意义?

答案 1 :(得分:2)

抱歉,我的英语......

<%= simple_form_for(@post, url: blog_path) do |f| %>在此行中,您将表单重定向到show(blog_path) 但是,根据路线,节目需要一个id (博客GET / blog /:id(。:format))

您必须在控制器中创建一个“创建”方法,该方法接收参数strong ...

您可以使用另一种方法:rails生成scaffold_controller帖子

这将构建完整的CRUD,因此您只需配置参数

我希望能帮到你

答案 2 :(得分:0)

我以这种方式充分利用了这两个世界:

resources :blog, to: 'posts'
resources :posts