2012-07-03 44 views
2

如何限制show動作可用的記錄?我遇到的問題是,您可以手動更改URL中的ID並查看不屬於該公司的項目。將記錄匹配到show動作中的嵌套路線

我的路線是這樣的:

/公司/: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

類公司<的ActiveRecord :: Base的 attr_accessible:命名

has_many :projects 

+0

企業和項目是否有關聯? – PriteshJ

+0

是的,我已經添加了一些模型代碼來顯示設置 –

回答

2

假設你有Company之間的關係has_manyProject我會改變你的控制R代碼裏面這樣:

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

但請記住,這並不能真正解決你的問題,因爲人們仍然可以改變company_id地查看其它公司。你需要的是一個更堅實的授權框架,如CanCan,可以防止對資源的未授權訪問。

+0

因此,我可以保持原樣並通過授權進行訪問嗎? –

+0

我仍然會這樣做,以防止有權訪問多家公司的用戶在公司a的佈局中查看來自公司b的項目(如果他們弄亂了這些參數)並非真的有必要,但也不難;) – Tigraine

0

可能,你應該使用水木清華這樣的:

@project = @ company.projects.find(PARAMS [:編號])

檢查this瞭解詳情。

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