2013-04-23 105 views
0

我正在處理我的收件箱郵件系統的未讀文件夾。當去/ users/1/messages?mailbox = unread並且它指向消息控制器時,我收到了一個未定義的方法`unread_messages'。不過,我有在user.rb中定義的unread_messages,以便它顯示收件箱中的未讀郵件,所以我假設代碼也應該爲未讀文件夾工作。任何幫助,將不勝感激。控制器中未定義的方法`unread_messages'

user.rb:

class User < ActiveRecord::Base 
    has_secure_password 
    attr_accessible :role, :age, :age_end, :password_confirmation, :about_me, :feet, :inches, :password, :birthday, :career, :children, :education, :email, :ethnicity, :gender, :height, :name, :password_digest, :politics, :religion, :sexuality, :user_drink, :user_smoke, :username, :zip_code 
    validates_uniqueness_of :email 
    validates_format_of :email, with: /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i 
    validates_presence_of :password, :on => :create 
    has_many :galleries 
    has_many :photos, :through => :galleries 
    before_create { generate_token(:auth_token) } 
    ROLES = %w[admin user guest banned] 

    # models/user.rb 
    after_create :setup_gallery 

    def received_messages 
     Message.received_by(self) 
    end 

def unread_messages? 
    unread_message_count > 0 ? true : false 
end 

def sent_messages 
    Message.sent_by(self) 
end 

# Returns the number of unread messages for this user 
def unread_message_count 
    eval 'messages.count(:conditions => ["recipient_id = ? AND read_at IS NULL", self.user_id])' 
end 

    def to_s; username 
    end 

    def has_role?(role_name) 
    role.present? && role.to_sym == role_name.to_sym 
    end 

    def send_password_reset 
    generate_token(:password_reset_token) 
    self.password_reset_sent_at = Time.zone.now 
    save! 
    UserMailer.password_reset(self).deliver 
    end 

    def generate_token(column) 
    begin 
     self[column] = SecureRandom.urlsafe_base64 
    end while User.exists?(column => self[column]) 
    end 

    private 
    def setup_gallery 
    self.galleries << Gallery.create 
    end 
end 

messages_controller:

def index 
    if params[:mailbox] == "sent" 
     @messages = @user.sent_messages 
    elsif params[:mailbox] == "inbox" 
     @messages = @user.received_messages 
    #elsif params[:mailbox] == "archieved" 
    # @messages = @user.archived_messages 
    end 
    if params[:mailbox] == "unread" 
    @messages = @user.unread_messages 
    end 
    end 

    def new 
    @message = Message.new 
    if params[:reply_to] 
     @reply_to = User.find_by_user_id(params[:reply_to]) 
     unless @reply_to.nil? 
     @message.recipient_id = @reply_to.user_id 
     end 
    end 
    end 

    def create 
    @message = Message.new(params[:message]) 
    @message.sender_id = @user.id 
    if @message.save 
     flash[:notice] = "Message has been sent" 
     redirect_to user_messages_path(current_user, :mailbox=>:inbox) 
    else 
     render :action => :new 
    end 
    end 

    def show 
    @message = Message.find(params[:id]) 
    @message.readingmessage if @message.recipient == current_user 
    end 

    def destroy 
    @message = Message.find(params[:id]) 
    @message.destroy 
    flash[:notice] = "Successfully deleted message." 
    redirect_to user_messages_path(@user, @messages) 
    end 

    def delete_multiple 
     if params[:delete] 
     params[:delete].each { |id| 
      @message = Message.find(id) 
      @message.mark_message_deleted(@message.id,@user.id) unless @message.nil? 
     } 
     flash[:notice] = "Messages deleted" 
     end 
     redirect_to user_messages_path(@user, @messages) 
    end 

    private 
    def set_user 
     @user = current_user 
    end 
end 

message.rb:

attr_accessible :subject, :body, :sender_id, :recipient_id, :read_at,:sender_deleted,:recipient_deleted 
validates_presence_of :subject, :message => "Please enter message title" 

belongs_to :sender, 
:class_name => 'User', 
:foreign_key => 'sender_id' 
belongs_to :recipient, 
:class_name => 'User', 
:foreign_key => 'recipient_id' 

# marks a message as deleted by either the sender or the recipient, which ever the user that was passed is. 
# When both sender and recipient marks it deleted, it is destroyed. 
def mark_message_deleted(id,user_id) 
    self.sender_deleted = true if self.sender_id == user_id 
    self.recipient_deleted = true if self.recipient_id == user_id 
    (self.sender_deleted && self.recipient_deleted) ? self.destroy : self.save! 
end 
# Read message and if it is read by recipient then mark it is read 
def readingmessage 
    self.read_at ||= Time.now 
    save 
end 

# Based on if a message has been read by it's recipient returns true or false. 
def read? 
    self.read_at.nil? ? false : true 
end 

def self.received_by(user) 
    where(:recipient_id => user.id) 
end 

def self.not_recipient_deleted 
    where("recipient_deleted = ?", false) 
end 

def self.sent_by(user) 
    Message.where(:sender_id => user.id) 
    end 

end 

回答

2

首先,你定義unread_messages?方法,不unread_messages

其次,你不應該在unread_messages?方法使用? :

unread_messages_count > 0 

就足夠了。

您應該在用戶模型中定義unread_messages方法。我無法在此方法中顯示內部代碼,因爲我不知道您的模型關係。

+0

我已經嘗試了這幾個不同的閃避,似乎無法讓頁面起作用。我包含更多的代碼,包括消息模型。如果你可以看一看,並給出一些好的指針。對於'?'在unread_messages。不使用它的原因是什麼?我只是想了解它,以便我可以知道以供將來參考。謝謝 – pwz2000 2013-04-23 16:08:13

+0

包含你的用戶模型來源,請 – 2013-04-23 16:13:28

+0

添加上面的用戶模型 – pwz2000 2013-04-23 16:20:54

0

您定義

unread_messages? # note the question mark 

然後把它稱爲

@user.unread_messages # no question mark 

你可能想的方法

def unread_messages ## which holds the actual unread messages and does not return boolean 
相關問題