【问题标题】:Rails: Form_for: No route matches {:action=>"show", :controller=>"posts"} missing required keys: [:id]Rails:Form_for:没有路线匹配{:action =>“show”,:controller =>“posts”}缺少必需的键:[:id]
【发布时间】:2017-09-13 22:16:50
【问题描述】:

我对 RoR 完全陌生,并试图建立一个简单的博客,但已经被“添加帖子”功能卡住了。

加载.../posts/new时弹出以下错误消息:

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

这是我的帖子控制器的样子:

class PostsController < ApplicationController
def index 
end

def new 
end

def create 
    render plain: params[:post].inspect
end

结束

这是我的new.html.erb 的样子:

<h1>Add Post</h1>
<%= form_for :post, url: posts_path do |f| %>
<p>
    <%= f.label :title %><br>
    <%= f.text_field :title %>
</p>

<p>
    <%= f.label :body %><br>
    <%= f.text_area :body %>
</p>

<p>
    <%= f.submit %>
</p>
<% end %>

我已将帖子设置为路线中的资源。令人惊讶的是,在我朋友的笔记本电脑上,代码可以运行。

我会很高兴收到任何建议,并为这个愚蠢的问题道歉。

【问题讨论】:

  • 我编辑了您的标题,并删除了其中的脏话。如果没有必要,请不要使用脏话。

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


【解决方案1】:

form_for 助手正在寻找要操作的资源对象,而您正在给它一个符号。我怀疑它假设这是一个操作 URL,并将该符号转换(或尝试)转换为路由。

new 操作中使用form_for,该模式通常是创建一个新资源并将其提供给form_for 助手:

def new
  @post = Post.new
end
<%= form_for @post, url: posts_path do |f| %>
  ...
<% end %>

【讨论】:

  • @post 对象没有 id,所以表单仍然会报错,问题是他使用的路径不是用于创建对象,而是用于更新对象。
  • @GuillermoSiliceoTrueba 表单不关心资源 ID,除非你自己创建它们,即使那样它们也会很乐意接受 nil。
  • 但它不是 form_for 抱怨它的 post_path 并且他们确实关心 nil
  • @GuillermoSiliceoTrueba 是的,但关键是 post_path 助手根本不应该被调用 - 它需要一个 对象,而不是路由。
  • 这就是解决方案,删除 url: post_path 部分,它会自动选择正确的路径。
【解决方案2】:

检查您的路线:

$rake routes

您会看到带有 id 的 posts_path 用于更新“帖子”而不是创建帖子,您还会找到要创建新“帖子”的路径。

您可能会说:但我没有更新操作。如果在您的路由文件中使用了您所做的资源关键字,即使该操作本身丢失。

更新: 删除

url: post_path

来自您的 form_for 调用

我的建议,查看rails guides on routing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多