【问题标题】:Couldn't find Message with 'id'=找不到带有 'id'= 的消息
【发布时间】:2015-08-28 04:27:39
【问题描述】:

当我在messages.rb 中的索引操作中定义@message 时,错误跳转:Could't find Message with 'id'= while go to /messages。但是我还在销毁操作中定义了@message,它永远不会导致这个错误。

app/controllers/messages.rb

  class MessagesController < ApplicationController
before_action :authenticate_user!

def new
    @message = current_user.messages.build
end

def create
    @message = current_user.messages.build(message_params)
    if @message.save
        redirect_to messages_path
    else
        render '/messages/new'
    end
end

def edit
end

def update
end

def destroy
    @message = Message.find(params[:id])
    @message.destroy
    redirect_to '/messages'
end

def index
    @messages = Message.order(id: :desc).paginate(page: params[:page])
    @message = Message.find(params[:id])
end

protected

def setup
end

def message_params
    params.require(:message).permit(:content)
end

结束

日志中的错误:

于 2015-06-12 15:57:59 +0800 开始为 ::1 获取“/messages” MessagesController#index 处理为 HTML 用户负载 (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 4]] 消息加载 (0.2ms) SELECT "messages".* FROM "messages" WHERE "messages"."id" = ?限制 1 [[“id”,无]] Completed 404 Not Found in 20ms (ActiveRecord: 1.3ms) ActiveRecord::RecordNotFound(找不到带有 'id'= 的消息): app/controllers/messages_controller.rb:31:in `index'

不知道为什么会这样,和分页有关系吗?因为我发现其他实例变量可以用 @var = Var.find(params[:id]) 定义,如果没有像 @vars = Var.paginate(page: params[:page ]) 在同一个动作中定义。

【问题讨论】:

  • 需要传id,没有传id。最佳实践是索引提供记录集合。但如果这是您的要求,那么您需要传递 id。
  • 谢谢,如何在 index.html.erb 中传递 id?
  • 为什么要显示所有消息并在同一页面获取单个 message_id?
  • 这完全是一个单独的问题,首先标记一个人们回答的答案,因为您的主要问题得到了回答。对于上面的脚本,你不需要唯一的 id,应用类可以解决你的问题。请单独提出问题,这无关紧要。

标签: ruby-on-rails


【解决方案1】:

只需从您的 index 操作中删除此行:

@message = Message.find(params[:id])

它不起作用,因为params 中没有id 参数。在destroy 动作中它存在是因为它是通过路由传递的。为澄清起见,比较 2 条路径:

Get /messages
Delete /messages/2

在第二条路由中,2 代表消息的 id。在第一个中它不存在。

更新

对于您在评论中的问题:

<% @messages.each do |message| %>
  <div id="message-<%= message.id %>">
<% end %>

【讨论】:

  • 感谢您的解释,这让我现在更清楚了。我还有一个问题:如果我在 /messages 中有一个消息列表,并且我想为每个消息指定一个 ID,例如 &lt;div id="message-&lt;%= @message.id %&gt;"&gt;,我应该如何编写代码?
  • 是的,我以前做过。但是我想在js中使用id,比如$("#message-"),这会导致未定义变量错误,因为我没有在索引中定义。
【解决方案2】:

问题在于您的索引操作中的这一行。

@message = Message.find(params[:id])

销毁操作后params[:id] 不再可用。此行不是必需的。如果你想使用它,你必须指定参数。

【讨论】:

  • 谢谢,但是如何指定参数?我是新来的。
猜你喜欢
  • 2014-07-15
  • 2015-08-11
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 2018-06-05
  • 2015-10-05
  • 1970-01-01
相关资源
最近更新 更多