ruby-on-rails - rails:有没有可能我的receiver_id 没有被选中?
问题描述
我正在为我的 rails 应用程序实施消息传递解决方案,但我不断收到以下错误。
PG::InvalidTextRepresentation - ERROR: invalid input syntax for integer: ""
第 1 行:...rsations" WHERE ((sender_id = 3 AND receiver_id = '') OR (se...
class MessagesController < ApplicationController
def create
if current_user.id == message_params[:receiver_id]
redirect_to request.referrer, alert: "You cannot send a message to yourself"
end
conversation = Conversation.where("(sender_id = ? AND receiver_id = ?) OR (sender_id = ? AND receiver_id = ?)",
current_user.id, message_params[:receiver_id],
message_params[:receiver_id], current_user.id
).first
if !conversation.present?
conversation = Conversation.create(sender_id: current_user.id, receiver_id: message_params[:receiver_id])
end
@message = Message.new(user_id: current_user.id,
conversation_id: conversation.id,
content: message_params[:content]
)
if @message.save
format.html { redirect_to request.referrer, notice: 'Message was successfully sent.' }
else
format.json { render json: request.referrer.errors, status: :unprocessable_entity }
end
end
对话模型。
class Conversation < ApplicationRecord
belongs_to :sender, class_name: "User"
belongs_to :receiver, class_name: "User"
def last_message
message = Message.where(conversation_id: self.id).last
if message.present?
return message
else
return Message.new updated_at: Time.now
end
end
end
解决方案
发生这种情况是因为您传递的值reciever_id
是一个空字符串,但数据库中该列的数据类型是一个整数。
您可以使用or
来进行查询,但它会将您的空字符串转换为 nil:
reciever_id = message_params[:reciever_id]
Conversation.where(sender_id: current_user.id, reciever_id: reciever_id)
.or(Conversation.where(sender_id: reciever_id, reciever_id: current_user.id))
无论如何,您可能想要检查您收到的内容以便执行您正在执行的查询。它可以分配默认值、提前返回、为您的路线添加约束等。