Rails在验证之前抛出错误

时间:2013-03-24 15:33:40

标签: ruby-on-rails validation

我正在尝试在rails中实现一个关键的消息系统,这是我的表:

create_table :messages do |t|
  t.integer    :sender_id,          :null => false
  t.integer    :recipient_id,       :null => false
  t.text       :content
  t.boolean    :read,               :null => false, :default => false

  t.timestamps
end

这是我的message型号:

  attr_accessible :recipient_id, :sender_id, :content

  belongs_to :user

  validates_presence_of :recipient_id, :sender_id, :content

  before_validation :recipient

  def recipient
    self.recipient_id = User.find_by_email(self.recipient_id.to_s).id
  end

和我的表格:

<%= form_for @message, :url => {:action => 'index'}, :as => :message do |message| %>
  <%= message.text_field :recipient_id, :placeholder => "to" %>

  <%= message.text_area :content, :placeholder => "i am saying..."%>

  <%= message.submit "Send" %>
<% end %>

和控制器:

def create
  @message = Message.new(params[:message])
  @message.sender_id = current_user

  if @message.save
      set_flash "Message sent"
      render 'index'
  else
      set_flash "Message Failed"
      render 'index'
  end

想法是用户1 recipient_id文本字段中输入 user2 电子邮件,然后之前的验证将触发并检索用户2 < / em> id基于来自user table的电子邮件,但是当我尝试它时,我收到此错误:

undefined method `to_i' for #<User:0x00000004344780>

有什么问题?

修改

这是抛出错误的一行:

@message.sender_id = current_user

如果我将current_user更改为current_user.id,则会出现此错误:

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

在这一行:

    self.recipient_id = User.find_by_email(self.recipient_id.to_s).id

由于

1 个答案:

答案 0 :(得分:1)

在create方法中尝试这个,

@message.sender_id = current_user.id

而不是@message.sender_id = current_user

我认为您正在使用sender_id对象设置current_user,而期望id整数。

修改

对于新错误,User.find_by_email方法找不到记录,因此返回nil

您的代码也存在问题,

self.recipient_id = User.find_by_email(self.recipient_id.to_s).id

您正在设置self.recipient_id并使用self.recipient_id进行搜索。 <{1}}似乎self.recipient_id,除非nil设置在其他地方。

如果数据库中有一个与self.recipient_id匹配的收件人,则此代码不会执行任何操作。它会将self.recipient_id设置为self.recipient_id