最像rails的结构方式是什么?



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

我目前有一个简单的基于资源的控制器,叫做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

,但这将是庞大的和混乱的所有操作。我相信一定有更好的办法。做这件事最合适的方法是什么?我应该创建一个全新的控制器来处理基于用户的消息吗?

我有两个办法:

你可以把你的代码放在控制器的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

IMHO,我认为您可以将这段代码移动到模型中,因此控制器只调用传递用户参数并从模型获取所有消息。

# 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代码,但我现在没有主意了。

相关内容

  • 没有找到相关文章

最新更新