在 Rails 上自定义 Ruby 中的 URL 资源

Customizing URL of resources in Ruby on Rails

我有一个应用程序具有以下三个模型:DoctorPatientAdmin,它们继承自 User 模型。这三个模型中的每一个都有自己的视图和控制器,但登录表单相同。下面是登录用户的方法。

    // session_controller.rb
      def create
    user = User.find_by(email: params[:session][:email])
    if user && user.authenticate(params[:session][:password])
        redirect_to user
    else
        flash.now[:danger] = 'Invalid e-mail/password combination'
        render 'new'
    end
  end

以及用于将 redirect_to user 调用重定向到模型特定视图的路由。

# routes.rb

resources :patients, :doctors, :admins

到这里为止,一切正常,我被重定向到 URI,例如 /patients/1/doctors/2.但是,我不希望在 URL 中看到用户 ID。如何将其更改为自定义的,例如 /:username/

您需要覆盖模型中的 to_params 方法。

查看此页面http://apidock.com/rails/ActiveRecord/Base/to_param

你可以做类似

def to_param
   id + "-" + username
end

如果从 to_param 方法中删除 id,则必须更新获取 users/doctors/etc

的方式

例如,如果您在 to_param 方法中只有用户名,则必须使用

获取用户
User.find_by_username(params[:id])

实现它的方法很少:

  • 假设您使用一些像 current_user 这样的辅助方法,您可以创建例如route /profile 指向 profile_controller#show。无论您是谁(医生、患者、管理员),您都已登录并且您的 "resource" ID 在 url 中不可见。 已编辑:如果您不确定如何正确地向 RoR 应用程序添加身份验证,请查看 "warden" gem(或更复杂的 "devise",其中有引擎盖下的典狱长)
  • 你可以使用"friendly" urls,在大多数情况下使用urls,如“1-用户名”等。你当然可以删除ID部分(1- xx),但您仍然必须提供唯一标识符(它可以是资源的 uuid、name/email 与某些字段的唯一组合等)。有关友善 url 的更多信息,请点击此处:https://gist.github.com/jcasimir/1209730