Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 这条路线的路线是什么?_Ruby On Rails - Fatal编程技术网

Ruby on rails 这条路线的路线是什么?

Ruby on rails 这条路线的路线是什么?,ruby-on-rails,Ruby On Rails,在链接到中引用此路径的干法是什么 作为旁注,我使用'users/:id/edit'编辑姓名/位置/年龄等,我使用上面的路径编辑密码和电子邮件,因为我希望在编辑这些更敏感的属性之前,强制用户对其的:current\u密码进行身份验证。我提到这一点只是为了确保我的路由逻辑是正确的 只需运行rake routes,您就会在应用程序中看到所有的路由。它应该在最右边将其更改为: get 'users/:id/edit/settings' => 'users#account' 然后,您可以将其引用为

链接到
中引用此路径的干法是什么


作为旁注,我使用
'users/:id/edit'
编辑姓名/位置/年龄等,我使用上面的路径编辑密码和电子邮件,因为我希望在编辑这些更敏感的属性之前,强制用户对其
:current\u密码进行身份验证。我提到这一点只是为了确保我的路由逻辑是正确的

只需运行
rake routes
,您就会在应用程序中看到所有的路由。它应该在最右边

将其更改为:

get 'users/:id/edit/settings' => 'users#account'
然后,您可以将其引用为:

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

rake routes
可能会为您提供一个类似于
users\u path
的路径,您可以使用类似

您可以使用
as:
选项设置命名路由

但是,我会将其设置为传统的铁路路线:

link_to edit_user_settings_path(@user)
这将创建一个习惯上正确的RESTful路由

使用单数
资源
创建没有id参数的路由。此外,您应该仅对路由中最右边的动态段使用名称
:id
,以避免违反最小意外原则


rake路由
将向您显示以下路由:

Rails.application.routes.draw do
  resources :users do
    resource :settings, only: [:edit, :update], module: :users
  end
end
作为旁注,我使用“users/:id/edit”编辑姓名/位置/年龄等 我使用上面的路径编辑密码和电子邮件,因为我 希望在之前强制用户验证其:当前\u密码 编辑这些更敏感的属性。我提到这一点只是为了使 确保我的路由逻辑是正确的

您的路线将不会强制执行此授权问题

相反,您应该在控制器中执行检查:

            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
...

您的路线不会强制执行此授权问题。
是的,我知道。我的意思是你在回答的前半部分提到的惯用正确路线。干杯
# 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