什么是最像铁路的结构如下

时间:2012-12-27 10:22:54

标签: ruby-on-rails-3

我在我的应用中使用了两种不同类型用户的设计。他们被称为用户和专业人士。

我目前有一个名为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

但是这会对所有行为造成笨重和混乱。我相信一定有更好的方法。这样做最像铁路的是什么?我应该创建一个全新的控制器来处理基于用户的消息吗?

2 个答案:

答案 0 :(得分: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 :(得分: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代码,但我现在没有想法了。