将记录与show动作中的嵌套路径匹配

时间:2012-07-03 09:27:47

标签: ruby-on-rails controller routes nested-resources

如何限制show动作可用的记录?我遇到的问题是你可以手动更改URL中的ID并查看不属于公司的项目。

我的路线看起来像这样:

/公司/:ID /项目/:ID

这是节目动作

projects_controller.rb

def show
    @project = Project.find(params[:id])
    @company = Company.find(params[:company_id])
    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @project }
    end
end

的routes.rb

resources :companies do
    resources :projects
    resources :employees
    resources :requests do
      put 'accept', :on => :member
    end
end

project.rb

class Project < ActiveRecord::Base
  attr_accessible :title

  belongs_to :company

 validates :title, presence: true
end

company.rb

类公司&lt;的ActiveRecord :: Base的     attr_accessible:name

has_many :projects

3 个答案:

答案 0 :(得分:2)

假设has_manyCompany之间存在Project关系,我会将您的控制器代码更改为:

def show
  @company = Company.find(params[:company_id])
  @project = @company.projects.find(params[:id])
end

请记住,这并不能真正解决您的问题,因为人们仍然可以更改company_id并轻松查看其他公司。您需要的是一个更加可靠的授权框架,如CanCan,可以防止未经授权的资源访问。

答案 1 :(得分:0)

可能是,你应该像这样使用smth:

  

@project = @ company.projects.find(params [:id])

查看this了解详情。

答案 2 :(得分:0)

尝试将操作更改为此

def show
    @company = Company.find(params[:company_id])
    @project = @company.projects.find(params[:id])
    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @project }
    end
end