get 'users/:id/edit/settings' => 'users#account'
在link_to
中引用此路径的干燥方法是什么?
作为旁注,我使用'users/:id/edit'
编辑姓名/位置/年龄等,我使用上面的路线编辑密码和电子邮件,因为我希望强制用户authenticate
他们的在编辑这些更敏感的属性之前:current_password
。我提到这只是为了确保我的路由逻辑是正确的。
答案 0 :(得分:1)
只需运行rake routes
,您就会看到应用中的所有路线。它应该是最右边的
答案 1 :(得分:1)
您可以使用as:
选项设置命名路线。
但是我会用传统的铁路路线进行设置:
Rails.application.routes.draw do
resources :users do
resource :settings, only: [:edit, :update], module: :users
end
end
这将创建一个惯用的正确RESTful路由。
使用单数resource
创建没有id参数的路由。此外,您应该只使用名称:id
作为路线中最右侧的动态段,以避免违反最小意外原则。
rake routes
会显示以下路线:
Prefix Verb URI Pattern Controller#Action
edit_user_settings GET /users/:user_id/settings/edit(.:format) users/settings#edit
user_settings PATCH /users/:user_id/settings(.:format) users/settings#update
PUT /users/:user_id/settings(.:format) users/settings#update
...
作为旁注,我使用' users /:id / edit'编辑名称/位置/年龄等 我正在使用上面的路线来编辑密码和电子邮件,因为我 希望强制用户在之前验证他们的:current_password 编辑这些更敏感的属性。我只提到这个 确定我的路由逻辑是正确的。
您的路线绝不会强制执行此授权问题。
相反,你应该检查你的控制器:
# app/models/users/settings_controller.rb
class Users::SettingsController
before_action :set_user
before_action :check_password, except: [:edit]
def edit
# ...
end
def update
# ...
end
private
def set_user
@user = User.find(params[:user_id])
end
def check_password
# this is an example using ActiveModel::SecurePassword
unless @user.authorize(params[:current_password])
@user.errors.add(:current_password, 'must be correct.')
end
end
end
答案 2 :(得分:0)
将其更改为:
get 'users/:id/edit/settings' => 'users#account', as: :edit_user_settings
然后您可以将其引用为:
link_to edit_user_settings_path(@user)
答案 3 :(得分:0)
rake routes
可能会为您提供类似users_path
的路径,您可以使用类似的方式链接到该路径
<%= link_to 'Users', users_path(@id) %>