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

时间:2011-05-17 02:39:33

标签: ruby-on-rails

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

我目前实现此方法的方式如下:match 'jobs/:id/assign/:type/:user_id' => 'jobs#assign'assign方法,params[:type]上有一个案例陈述。因此,例如,jobs/1/assign/qa/1将用户1指定为作业1的qa。

这有效,但看起来很草率,我想用更干净的东西取而代之。这样的情况是否有共同惯例?

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

class User < ActiveRecord::Base
  has_many :submitted_jobs,  :class_name => '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 < ActiveRecord::Base
  belongs_to :customer, :class_name => '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'

2 个答案:

答案 0 :(得分:1)

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

  

名词 是新动词

     
      
  • 改变解释场景的方式,一个动作   
        
    • 使用名词来描述行动
    •   
    • 为您的方案提供的名词您正在寻找的资源
    •   
  •   
  • 用户订阅 - &gt; <订阅
  •   
  • 该项目验证 - &gt; 项目验证已创建
  •   
  • 用户停用他的帐户 - &gt; 用户帐户激活已删除
  •   

您可以轻松创建“作业分配”资源(必然是单独的模型),例如,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开始)。

答案 1 :(得分:0)

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

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

员工/ 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没有登录,请告诉我,我会用其他解决方案相应地更新解决方案。