这类路线的最佳做法是什么?

我有一个belongs_to三个用户(客户,员工和qa)的Job模型。 创建作业时,客户设置为current_user ,但employee和qa用户从无人认领的作业池中选择其作业。

我目前实现此方法的方法如下: match 'jobs/:id/assign/:type/:user_id' => 'jobs#assign' ,其中assign方法带有对params[:type]的case语句。 因此,例如, jobs/1/assign/qa/1将用户1指定为作业1的qa。

这有效,但看起来很草率,我想用更干净的东西取而代之。 对于像这样的情况,有一个共同的约定吗?

编辑:用户可以同时拥有员工和qa角色。 这就是让我感到强迫进入如此复杂的路线的原因。

 class User  'Job', :foreign_key => 'customer_id' has_many :assigned_jobs, :class_name => 'Job', :foreign_key => 'employee_id' has_many :reviewed_jobs, :class_name => 'Job', :foreign_key => 'qa_id' class Job  'User', :foreign_key => 'customer_id' belongs_to :employee, :class_name => 'User', :foreign_key => 'employee_id' belongs_to :qa, :class_name => 'User', :foreign_key => 'qa_id' 

您可能会考虑使用更RESTful的方法来解决您的问题。 RESTful最佳实践引用的两个“经典初学者错误”是“强烈反映您的ActiveRecord数据模型以选择您的资源”,并且“如果标准方法不适合,则添加自定义方法”。

名词是新动词

  • 改变你解释场景的方式,一个动作
    • 使用名词来描述动作
    • 给你的场景的名词你正在寻找的资源
  • 用户订阅– >创建订阅
  • 该项目由其所有者validation – >创建项目validation
  • 用户停用其帐户– >删除用户帐户激活

您可以轻松创建“作业分配”资源(不一定是单独的模型),例如,使用正确的参数create一个。 在粗糙的伪Rails中:

 # routes resources :job_assignments, :only => [:create, :delete] # or whatever you need # job_assignments_controller class JobAssignmentsController < ApplicationController def create user = User.find(params[:user_id]) job = Job.find(params[:job_id]) user.assign(job, params[:job_type]) # handle model logic end def destroy user = User.find(params[:user_id]) job = Job.find(params[:job_id]) user.unassign(job, params[:job_type]) # handle model logic end end 

演示文稿中有一些很好的例子(从幻灯片32开始)。

我认为解决这个问题的好方法是首先设计您的路线,这就是您正在做的事情。

如果“工作”和受让人事先众所周知,那么您当前的路线很棒。 在我看来,如果你填写工作和受让人类型信息在你做的太多的路线。

员工/ qa是否也登录并选择自己的工作? 如果他们这样做,那么他们自己的信息将在服务器端的“current_user”中可用。

在这种情况下,理想情况下,路径应该是“/ job /:id / pick”,例如使用POST请求进入“JobsController#pick”操作。 在您的控制器操作中,您将获得current_user中的eemployee / qa用户信息。

 config/routes.rb resource :jobs do member do post :pick end end in app/controller/jobs_controller.rb def pick job = Job.find(params[:id]) current_user.jobs << job # User has_many :jobs # or job.user = current_user ... end 

如果员工/ qa没有登录,请告诉我,我将使用其他解决方案相应地更新解决方案。