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

我应该为公司设置一个控制人,还是多个控制人?那将如何工作?

我正在寻找这种情况下的最佳实践。

4

2 回答 2

1

在您的情况下,方法可以是:

  1. 使用DeviseRubyGem 处理身份验证。https://github.com/plataformatec/devise
  2. 使用 RESTful 操作集创建或搭建简单的 CompaniesController:index, new, create, edit, udpate, destroy操作。
  3. 添加before_filterCompaniesController限制对需要用户身份验证的操作的访问:

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

  4. 您应该has_many在 User 和 Company 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

恕我直言,如果所有用户都可以看到所有公司,那么拥有一个控制器来完成这项工作是完美的。只需在模板中,您就可以检查当前用户是否是指定公司的作者,然后添加链接以编辑该公司等,当然如果您愿意。

于 2012-05-23T12:52:50.280 回答