如何限制用户在特定资源上创建多个对象

时间:2018-07-29 17:40:42

标签: ruby-on-rails ruby

我想限制用户拥有一份以上的工作。

这是我的路线:

 resources :jobs do
   resources :job_applications
 end

job.rb

 class Job < ApplicationRecord
     has_many :job_applications

     validate :limit_user_to_one_job_application

    private

   def limit_user_to_one_job_application
    if user.job_applicaitons.count > 1 
      self.errors.add(:base, "You can only have one job application")
    end 
   end 
end

job_application.rb

class JobApplication < ApplicationRecord
  belongs_to :user
  belongs_to :job
end

user.rb
 class User < ApplicationRecord
  has_one :job_application

end

job_application_controller.rb

 class JobApplicationsController < ApplicationController

    before_action :authenticate_user!
      def new
        @job = Job.find(params[:job_id])
        @job_application = @job.job_applications.create

      end

      def create
        @job = Job.find(params[:job_id])
        @job_application = 
        @job.job_applications.create(job_application_params)
        @job_application.user_id = current_user.id
        @job_application.save
      end

在我的new.html.erb文件中以创建新的职位申请

 <%= form_with(model: [ @job, @job.job_applications.build ],local: true) do |f| %>
  <%= job_application attributes %> <br>
   <%= job_application attributes %> <br>
..........

  <%= f.submit %>

以上代码有效,使用户能够为特定作业创建许多作业应用程序,但仅将第一个作业保存在其数据库中。因此,我希望限制用户仅针对特定职位创建一个职位申请

2 个答案:

答案 0 :(得分:0)

您可以在控制器或模型上执行此操作。

before_action :find_job, except: [:index, :new, :create]
before_action :limit_user_to_one_job_application, only: [:new, :create]

...

private

def find_job
  @job = Job.find(params[:job_id])
end 

def limit_user_to_one_job_application
  if @job.job_applications.where(:user => current_user).count == 1
    return redirect_to jobs_path, :notice => "You can only have one job application"
  end 
end 

您会发现最好将@job.job_applications.where(:user => current_user).count == 1用作User上的方法,但为简单起见,我的意图很明确。

或模型(类似):

class JobApplication < ApplicationRecord
  validate :limit_user_to_one_job_application

  private

  def limit_user_to_one_job_application
    if user.job_applicaitons.count > 1 
      self.errors.add(:base, "You can only have one job application")
    end 
  end 
end

答案 1 :(得分:0)

按照帖子中提到的描述,您可以在联接模型中通过唯一性验证来进行管理。

  class JobApplication < ApplicationRecord
    belongs_to :user
    belongs_to :job

    validates_uniqueness_of :user_id, scope: :job_id
   end

此验证将防止基于user_id和job_id的配对在联接模型中创建重复记录。

希望这会有所帮助。