这条路线的路径是什么?

时间:2016-10-18 00:33:18

标签: ruby-on-rails

get 'users/:id/edit/settings' => 'users#account'

link_to中引用此路径的干燥方法是什么?

作为旁注,我使用'users/:id/edit'编辑姓名/位置/年龄等,我使用上面的路线编辑密码和电子邮件,因为我希望强制用户authenticate他们的在编辑这些更敏感的属性之前:current_password。我提到这只是为了确保我的路由逻辑是正确的。

4 个答案:

答案 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) %>