0

アプリで2つの異なるタイプのユーザーにdeviseを使用しています。彼らはユーザーとプロフェッショナルと呼ばれます。

私は現在、このような現在の専門家向けのメッセージを引き出す 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

しかし、これはすべてのアクションでかさばり、面倒です。きっともっと良い方法があるはずです。これを行う最もレールのような方法は何ですか? ユーザーベースのメッセージを処理する完全に新しいコントローラーを作成する必要がありますか?

4

2 に答える 2

1

次の 2 つの方法が考えられます。

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
于 2012-12-27T10:29:57.483 に答える
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 コードを改善することはできますが、今はアイデアがありません。

于 2012-12-27T10:30:19.213 に答える