1

会社がユーザーによって管理されている状況があります。つまり、ユーザーは自分の会社を作成、読み取り、更新、削除できます。ただし、同じユーザーが、ログアウトしている場合でも、システム内のすべての会社のリストにアクセスできるようにしたいと思います。

例えば:

user_aは、次の会社を管理します:company_aおよびcompany_b

user_bは、次の会社を管理します:company_cおよびcompany_d

user_aは、自分の会社のリスト(aおよびb)と、すべての会社のリスト(a、b、c、およびd)を表示できる必要があります。

コントローラでこれを処理するための最良の方法は何ですか?

理想的には、次のように2つの別々のルートでセットアップしたいと思います。

/companies
/users/1/companies

会社用に1つのコントローラーを使用する必要がありますか、それとも複数のコントローラーを使用する必要がありますか?そしてそれはどのように機能しますか?

このタイプのシナリオでのベストプラクティスを探しています。

4

2 に答える 2

1

あなたの状況では、アプローチは次のようになります。

  1. DeviseRubyGemを使用して認証を処理します。https://github.com/plataformatec/devise
  2. RESTfulアクションが設定された単純なCompaniesControllerを作成またはスキャフォールドします:index, new, create, edit, udpate, destroyactions。
  3. 追加before_filterCompaniesControllerて、ユーザー認証を必要とするアクションへのアクセスを制限します。

    before_filter:authenticate_user!、:except => [:public_list]

  4. has_manyの会社コレクションにアクセスするには、ユーザーモデルと会社ActiveRecordモデルの間に関連付けが必要ですcurrent_user

サンプルコードは次のとおりです。

ルーティング:

resources :users do
    resources :companies
end
match '/companies' => 'companies#public_list', :as => :public_companies_list

コントローラ:

class CompaniesController < ApplicationController
    before_filter :authenticate_user!, :except => [:public_list]


  def index
    @companies = current_user.companies
  end

  def show
    @company = current_user.companies.find(params[:id])
  end

  def new
    @company = current_user.companies.new
  end

  def edit
    @company = current_user.companies.find(params[:id])
  end

  def create
    @company = current_user.companies.new(params[:company])

    respond_to do |format|
      if @company.save
        format.html { redirect_to @company, notice: 'Company was successfully created.' }
      else
        format.html { render action: "new" }
      end
    end
  end

  def update
    @company = current_user.companies.find(params[:id])

    respond_to do |format|
      if @company.update_attributes(params[:company])
        format.html { redirect_to @company, notice: 'Company was successfully updated.' }
      else
        format.html { render action: "edit" }
      end
    end
  end

  def destroy
    @company = current_user.companies.find(params[:id])
    @company.destroy

    respond_to do |format|
      format.html { redirect_to companies_url }
    end
  end
end

公開会社リストの場合は、次の方法を追加します。

def public_list
  @companies = Company.all
end
于 2012-05-23T13:18:18.840 に答える
0

私見では、すべてのユーザーがすべての会社を見ることができれば、この仕事を得るのに1人のコントローラーがいるのは完璧です。テンプレートだけで、現在のユーザーが指定された会社の作者であるかどうかを確認し、もちろん必要に応じてこの会社などを編集するためのリンクを追加できます。

于 2012-05-23T12:52:50.280 に答える