2012-04-18 55 views
1

我的工作就像Gumtree.com,其中用户创建的帖子在网站上,突出自己的各种需求(例如,我需要一天X摄影师)。找不到用户不进行身份 - 形状误差在Rails 3的项目

遇到一些麻烦的消息功能。我正在使用Simple Private Messaging插件。

问题是在用户填写发送消息/向后响应的形式。我收到以下错误,当我试图访问/消息/新:

ActiveRecord::RecordNotFound in MessagesController#new 
Couldn't find User without an ID 

下方附上我的模型 - 的任何建议感激!

感谢,

费萨尔

留言控制器

class MessagesController < ApplicationController 

before_filter :set_user 

def index 
if params[:mailbox] == "sent" 
    @messages = @user.sent_messages 
else 
    @messages = @user.received_messages 
end 
end 

def show 
@message = Message.read_message(params[:id], current_user) 
end 

def new 
@message = Message.new 

if params[:reply_to] 
    @reply_to = @user.received_messages.find(params[:reply_to]) 
    unless @reply_to.nil? 
    @message.to = @reply_to.sender.login 
    @message.subject = "Re: #{@reply_to.subject}" 
    @message.body = "\n\n*Original message*\n\n #{@reply_to.body}" 
    end 
end 
end 

def create 
@message = Message.new(params[:message]) 
@message.sender = @user 
@message.recipient = User.find_by_login(params[:message][:to]) 

if @message.save 
    flash[:notice] = "Message sent" 
    redirect_to user_messages_path(@user) 
else 
    render :action => :new 
end 
end 

def delete_selected 
if request.post? 
    if params[:delete] 
    params[:delete].each { |id| 
     @message = Message.find(:first, :conditions => ["messages.id = ? AND (sender_id = ? OR recipient_id = ?)", id, @user, @user]) 
     @message.mark_deleted(@user) unless @message.nil? 
    } 
    flash[:notice] = "Messages deleted" 
    end 
    redirect_to :back 
end 
end 

private 
def set_user 
    @user = User.find(params[:user_id]) 
end 
end 

消息模型

class Message < ActiveRecord::Base 

is_private_message 

attr_accessor :to 

end 

用户模型

class User < ActiveRecord::Base 

has_many :posts 
has_one :profile 
has_private_messages 

attr_accessible :email 

validates_presence_of :email 
validates_uniqueness_of :email, :message =>"Hmm, that email's already taken" 
validates_format_of :email, :with => /^([^\s]+)((?:[-a-z0-9]\.)[a-z]{2,})$/i, :message => "Hi! Please use a valid email" 


end 

信息>新建VIEW

<% form_for @message, :url => user_messages_path(@user) do |f| %> 
<p> 
To:<br /> 
    <%= f.text_field :to %> 
    <%= error_message_on @message, :to %> 
</p> 
<p> 
Subject:<br /> 
<%= f.text_field :subject %> 
<%= error_message_on @message, :subject %> 
</p> 
<p> 
    Message<br /> 
    <%= f.text_area :body %> 
     <%= error_message_on @message, :body %> 
</p> 
<p> 
    <%= submit_tag "Send" %> 
</p> 
<% end %> 
+0

你还记得你是如何解决这个问题?我使用的是相同的插件,并且遇到同样的问题。我曾尝试将@user设置为User.first,User.find(1)等,但迄今为止没有运气。 – afaf12 2012-05-27 01:51:28

回答

2

你确定你的新邮件页面接收它的params:user_id?即使这是真的,我怀疑这是你的意图,因为任何人都可以通过传递另一个:user_id来伪装成另一个用户。

所以你在底线:

@user = User.find(params[:user_id]) # I think it's the cause of your error -- no :user_id is passed 

好像必须是:

@user = User.find(session[:user_id]) 

我想你听说过会议。

+0

我仍然得到相同的错误 – hikmatyar 2012-04-18 20:24:29

+0

只是简单的替换不会解决你的问题。尝试测试:将任何有效的ID传递给此find()方法,并查看您的操作是否有效。如果是这样 - 你首先不会传递':user_id'。 – jdoe 2012-04-18 20:27:29

+0

犯错 - 我是新来的铁轨。我不知道如何测试.. – hikmatyar 2012-04-18 20:29:37