在 Rails 上自定义 Ruby 中的 URL 资源
Customizing URL of resources in Ruby on Rails
我有一个应用程序具有以下三个模型:Doctor
、Patient
和 Admin
,它们继承自 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
我有一个应用程序具有以下三个模型:Doctor
、Patient
和 Admin
,它们继承自 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