1

我试图重命名 Devise 提供的所有注册路线,但现在我无法再更新帐户信息了。它通过 GET 请求呈现registrations#edit操作没有问题,但 PUT 和 DELETE 请求都以某种方式进入 sign_up 路径。

这是我当前的路线文件:

...

devise_for :users, path: '', path_names: { sign_in: 'login', sign_out: 'logout', sign_up: 'signup' }, controllers: { registrations: "registrations" }, skip: [:registrations]

as :user do
    get '/admin/cancel' => 'registrations#cancel', as: :cancel_user_registration
    post '/signup' => 'registrations#create', as: :user_registration
    get '/signup' => 'registrations#new', as: :new_user_registration
    get '/admin/settings/account' => 'registrations#edit', as: :edit_user_registration
    put '/admin/settings/account' => 'registrations#update', as: :update_user_registration
    delete '/admin/settings/account' => 'registrations#destroy', as: :destroy_user_registration
end

现在,当我访问“/admin/settings/account”时,它会按预期呈现编辑帐户视图。但是“更新”按钮使用 PUT 方法指向“/signup”,而“取消我的帐户”链接也指向“/signup”,但使用方法 DELETE。

然后我深入研究了渲染“注册/编辑”的视图,发现了这些

<%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %> ...

... <%= link_to "Cancel my account", registration_path(resource_name), confirm: "Are you sure?", method: :delete %> ...

所以registration_path(resource_name)实际上负责为 PUT 和 DELETE 生成正确的路由。但是由于我更改了默认的设计注册路线,它不再能够识别和吐出正确的路径。

有谁知道我该如何解决这个问题?实际上是什么registration_path(resource_name)意思?

4

1 回答 1

1

您应该将表单路径更改为您创建的路径。像这样:

<%= simple_form_for(resource, as: resource_name, url: update_user_registration_path, html: { method: :put }) do |f| %>

<%= link_to "Cancel my account", destroy_user_registration_path, confirm: "Are you sure?", method: :delete %>

当我写我的答案时,我尝试用谷歌搜索源代码,这样我就可以给你看,但我找不到。无论如何,registration_path接收一个参数,它是您要创建、更新或销毁的模型的名称,然后返回适当的 url 以进行调用。因此,假设您有 2 个角色或模型:用户和管理员。现在,使用相同的代码,您可以使用该路径销毁两者。为用户返回并<%= link_to "Cancel my account", registration_path(resource_name), method: :delete %>为管理员返回。/users/cancel/admins/cancel

在您的 routes.rb 文件中,您正在为某个模型定义路线的名称,对吗?这就是你对 line 所做的事情as :user do。您正在为用户定义路线的名称。因此,让我们继续以取消帐户为例。有了这个:

as :user do
  delete 'delete_account' => 'registrations#destroy', as: :destroy_user_registration
end

您可以destroy_user_registration_path不通过就使用,resource_name因为设计人员已经知道此 url 与 User 模型相关。

编辑:即使您有多个模型,您也可以在视图中更改registration_path(resource_name)update_user_registration_path。请记住,所有这些方法所做的只是创建一个您提交表单的 url,仅此而已。

您唯一需要注意的是编辑您的路线文件。

于 2012-11-15T13:55:50.203 回答