ruby-on-rails - 没有路由匹配缺少必需的键:[:id]。破坏
问题描述
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: <% if post.user == current_user %> 22: <%= link_to "Delete", user_post_path(@user, post), 23: data: { method: :delete, confirm: "你确定吗? " },类:“btn btn-danger”%> 24: <% end %> 25: <% end %>
先感谢您!
解决方案
您必须users#show
在用户控制器中的显示操作上初始化了一个新帖子,这会导致一个属于该用户的新帖子,因此当您在显示模板中循环它时,帖子也在循环中,但该新帖子是一条新记录并且没有身份证。
由于您正在循环@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
推荐阅读
- php - 以编程方式为 CLI 应用程序生成命名空间
- python - 需要有关如何将 Python 合并到 Azure,特别是 ASP.NET Web 应用程序环境的建议
- javascript - 未捕获的 RangeError:超出最大调用堆栈大小(是否存在数据限制大小)?
- python - 检查 Moodle 的哈希密码
- reactjs - 未捕获的错误:Reference.set 失败:第一个参数在属性“users.undefined.email”中包含未定义
- java - How to extract field from Google books api using GSON and Jsoup
- javascript - reactjs - 如何在reactjs中的同一个div上使用多个独立的条件样式?
- python-3.x - 使用类作为装饰器
- html - How to open file dialog box when click an image in Angular 6
- ubuntu - 关于在 ubuntu 18.04 上安装 FSL 6.0 的问题