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

実際には、 PUTregistration_path(resource_name)と DELETE の正しいルートの生成を担当しています。しかし、デフォルトの Devise 登録ルートを変更したため、正しいパスを認識して吐き出すことができなくなりました。

これを修正する方法を知っている人はいますか?とはどういう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 ファイルでは、特定のモデルのルートの名前を定義していますよね? それがあなたが行でやっていることですas :user do。ユーザーのルートの名前を定義しています。それでは、アカウントをキャンセルする例を続けましょう。これとともに:

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

devise はこの URL が User モデルに関連していることを既に認識しているため、destroy_user_registration_pathを渡さずに使用できます。resource_name

編集: 複数のモデルがある場合でも、ビューに変更できregistration_path(resource_name)ますupdate_user_registration_path。これらのメソッドはすべて、フォームを送信する URL を作成するだけであることを忘れないでください。

気をつけなければならないのは、routes ファイルの編集だけです。

于 2012-11-15T13:55:50.203 に答える