2013-10-26 38 views
0

在我的Rails應用程序中,people可以有很多projects,反之亦然。如何在Rails has_and_belongs_to_many模型中驗證提交的ID?

class Person < ActiveRecord::Base 

    has_and_belongs_to_many :projects 

    attr_accessible :name, :person_ids 

end 

class Project < ActiveRecord::Base 

    has_and_belongs_to_many :people 

    attr_accessible :name, :person_ids 

end 

在我ProjectsController我需要一種方法來確保沒有用戶都不能創建一個project屬於另一個用戶的people。現在,我的選擇框很容易被黑客攻擊,例如通過瀏覽器控制檯。

在我眼中,處理這個問題的最好方法是before_filter。這是我想出了一個:

class ProjectsController < ApplicationController 

    before_filter :valid_people, :only => [ :create, :update ] 

    def create 
    @project = current_user.projects.build(params[:project]) 
    if @project.save 
     flash[:success] = "Project created." 
     redirect_to edit_project_path(@project) 
    else 
     render :new 
    end 
    end 

    private 

    def valid_people # not working yet 
     if params[:project][:person_ids].present? 
     person = current_user.people.where(:id => params[:project][:person_ids]).first 
     redirect_to(root_path) unless person 
     end 
    end 

end 

然而,因爲我還是新到Rails我用valid_people方法的語法掙扎。我如何檢查person_ids是否屬於用戶?

感謝您的任何幫助。

+0

'User'與'Person'相同嗎? – jcm

+0

不可以。「用戶」可以有許多「人員」和「項目」。 – Tintin81

+0

啊。你應該發佈'User'類。您的應用程序的業務規則並不總是對其他人顯而易見。 – jcm

回答

0

看來你的用例需要一個一對多的關聯。

class Person < ActiveRecord::Base 
    has_many :projects 
end 

class Projects < ActiveRecord::Base 
    belongs_to :person 
end 

即使情況並非如此,進行此類驗證的方式將通過模型中的自定義驗證程序方法進行。控制器不是執行驗證的地方。

+0

感謝您的幫助。但你爲什麼這麼說?我的意思是,如果一個'project'實際上屬於多個'people'或一個'person'屬於多個'projects'呢?在我的特殊用例中,這很可能發生。 – Tintin81

+0

既然你提到一個項目如果有其他人與創建它的人不同,我就認爲這是一對多的關係,而不是多對多的關係。當然,我可能會誤解你的問題。 – depa

+0

不,我只是想確保'用戶A'的'人'不能干涉'用戶B'的'人'。 「項目」也是如此。 – Tintin81