创建使用model属性而不是Rails中的ID的自定义路由

时间:2013-04-03 23:37:27

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 routes custom-routes

我有一个名为Student的模型,其中包含一个名为University_ID的属性。

我创建了一个自定义动作和路线,通过以下链接显示特定学生的详细信息:students/2/details即。 students/:id/details

但是,我希望能够允许用户使用他们的大学ID而不是数据库ID,以便以下内容适用于students/X1234521/details  即students/:university_id/details

我的路线文件目前看起来像这样:

resources :students
match 'students/:id/details' => 'students#details', :as => 'details'

然而,这使用Student_ID而不是University_ID,我尝试过

match 'students/:university_id/details' => 'students#details', :as => 'details',但这只对应于Student_ID,而不是University_ID。

我的控制器看起来像这样,如果这有任何帮助:

def details
  @student = Student.find(params[:id])
end

我也试过做@student = Student.find(params[:university_id])但是没有,没有任何效果。

1 个答案:

答案 0 :(得分:1)

在与@teenOmar聊天以澄清要求之后,我们提出了解决方案,它允许现有students/:id/details路由接受iduniversity_id(以w开头,并使用before_filter填充@student以用于各种控制器操作:

class StudentsController < ApplicationController

  before_filter :find_student, only: [:show, :edit, :update, :details]

  def show
    # @student will already be loaded here
    # do whatever
  end

  # same for edit, update, details

private

  def find_student
    if params[:id] =~ /^w/
      @student = Student.find_by_university_id(params[:id])
    else
      @student = Student.find(params[:id])
    end
  end

end