我正在尝试在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
由于
答案 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
。