2012-12-27 21 views
0

我在我的应用程序中使用两种不同类型的用户的设计。他们被称为用户和专业人士。什么是最类似的方式来构建以下

我现在有一个名为MessagesController一个简单的资源为基础的控制器这对于目前的职业这样

class MessagesController < ApplicationController 
    def index 
     @messages = Message.find_all_by_profession_id(current_professional.id) 
    end 
end 

我想找到保持这种控制器,但更改查询基于类型的最佳方式翻出消息的已登录用户。我希望同样的情况发生在资源的所有行动(指数,新,创建,更新等)

我知道我能做到这一点

if current_user 
    @messages = Message.find_all_by_user_id(current_user.id) 
else 
    @messages = Message.find_all_by_profession_id(current_professional.id) 
end 

但是这在所有操作中都会很笨重和混乱。我相信肯定有更好的方法。像这样做的最有效途径是什么?我是否应该创建一个全新的控制器来处理基于用户的消息?

回答

1

我能想到的方法有两种:

你可以把你的代码initialize方法控制器内:

def initialize 
    if current_user 
     @messages = Message.find_all_by_user_id(current_user.id) 
    else 
     @messages = Message.find_all_by_profession_id(current_professional.id) 
    end 
    super 
end 

或者你可以创建一个before_filter

class MessagesController < ApplicationController 
    before_filter :get_messages 
    private 
    def get_messages 
    if current_user 
     @messages = Message.find_all_by_user_id(current_user.id) 
    else 
     @messages = Message.find_all_by_profession_id(current_professional.id) 
    end 
    end 
end 
1

恕我直言,我认为你可以将这块代码移动到模型中,所以控制器只会传递用户参数并从模型中获取所有消息。

# messsages_controller.rb 
@messages = Message.find_all_messages(current_user, current_professional) 

# message.rb 
def self.find_all_messages(user, professional) 
    if user 
    self.find_all_by_user_id(user.id) 
    else 
    self.find_all_by_profession_id(professional.id) 
    end 
end 

我认为这种代码更适合您的模型。当然你可以改进if/else代码,但是我现在没有想法。

相关问题