没有路由匹配缺少必需的键:[:id]。破坏

Posted

技术标签:

【中文标题】没有路由匹配缺少必需的键:[:id]。破坏【英文标题】:No route matches missing required keys: [:id]. destroy 【发布时间】:2021-11-18 23:41:35 【问题描述】:
resources :users do
   resources :posts, only: %i[create destroy]
end  
class PostsController < ApplicationController
  before_action :set_user
  before_action :set_post, expect: [:create]
  def create
    @post = @user.posts.build(params_post)

    if @post.save
      flash[:success] = "Post created!"
      redirect_to user_path(@user)
    else
      @posts = Post.all
      render "users/show"
    end 
  end 

  def destroy
    @post.destroy
    flash[:success] = "Post deleted!"
    redirect_to user_path(@user)
  end 

  private

  def set_user
    @user = User.find(params[:user_id])
  end 

  def set_post
    @post = @user.posts.find(params[:id])
  end 

  def params_post
    params.require(:post).permit(:content)
  end 
end
# views/users/show.html.erb 
<article>
  <% @user.posts.each do |post| %>
    <p> 
      <%= post.content %>
      <small><%= formatted_at_time(post.created_at) %></small>
    </p>

    <% if post.user == current_user %>
    <%= link_to "Delete", user_post_path(@user, post),
        data:  method: :delete, confirm: "Are you sure?" , class: "btn btn-danger" %>
    <% end %>
  <% end %>
</article>

ActionView::Template::Error(没有路由匹配 :action=>"destroy", :controller=>"posts", :id=>nil, :user_id=>"4",缺少必需的键: [:ID]): 19:

20: 21: 22: 24: 25:

提前谢谢你!

【问题讨论】:

看起来post 是零。有没有@user.posts 记录?或者,rails routes 告诉你什么?那里会有很多,但请寻找user_post* 路径。 将您的代码发布在用户控制器操作显示中也是一个好主意,这样我们就可以了解有关该问题的更多信息。 【参考方案1】:

您必须在用户控制器中的users#show 显示操作上初始化了一个新帖子,这会导致一个属于该用户的新帖子,因此当您在显示模板中循环它时,该帖子也在循环中,但是新帖子是新记录,没有id。

由于您循环使用@user.posts,因此无需检查post.user == current_user,请从此更改:

<% if post.user == current_user %>
    <%= link_to "Delete", user_post_path(@user, post),
        data:  method: :delete, confirm: "Are you sure?" , class: "btn btn-danger" %>
<% end %>

到这里

<% if post.persisted? %>
    <%= link_to "Delete", user_post_path(@user, post),
        data:  method: :delete, confirm: "Are you sure?" , class: "btn btn-danger" %>
<% end %>

#persisted?

如果记录被持久化,即它不是新记录且未被销毁,则返回 true,否则返回 false。

查看更多关于#persisted?这里https://apidock.com/rails/v5.2.3/ActiveRecord/Persistence/persisted%3F

【讨论】:

以上是关于没有路由匹配缺少必需的键:[:id]。破坏的主要内容,如果未能解决你的问题,请参考以下文章

域路由错误 Laravel 中缺少必需的参数

启动路由器时出现意外错误:错误:缺少必需的参数“catchAll”

为啥我的路由在调用破坏函数后会失败?

我该如何解决问题:模块/ contrib / redirect / modules / redirect_404中缺少必需的键(核心)?

laravel5路由改为规则匹配

laravel5路由改为规则匹配