0

在我的 Rails 应用程序people中可以有很多projects,反之亦然。

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属于用户?

谢谢你的帮助。

4

1 回答 1

-1

您的用例似乎需要一对多关联。

class Person < ActiveRecord::Base
  has_many :projects
end

class Projects < ActiveRecord::Base
  belongs_to :person
end

即使不是这种情况,进行这种验证的方法也是通过模型中的自定义验证器方法。控制器不是执行验证的地方。

于 2013-10-26T14:40:04.083 回答