首页 > 解决方案 > 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

标签: ruby-on-rails

解决方案


发生这种情况是因为您传递的值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))

无论如何,您可能想要检查您收到的内容以便执行您正在执行的查询。它可以分配默认值、提前返回、为您的路线添加约束等。


推荐阅读