我在我的应用程序和自定义用户控制器中使用devise gem。我在show和index页面都有编辑用户的链接。登录后,如果我点击users / index.html.erb或users / edit.html.erb中的修改链接,即使发送了GET请求,它也会重定向到用户新表单。
在路线中,我正在跳过注册,因为我正在使用用户控制器来处理它并且工作正常。
这是路线
devise_for :users, :path_prefix => 'd', skip: [:registrations], controllers: {sessons: "sessions"}
resources :users
耙路线| grep edit_user 给出了
edit_user_password GET /d/users/password/edit(.:format) devise/passwords#edit
edit_user GET /users/:id/edit(.:format) users#edit
用户/ show.html.erb
<div class="btn btn-primary"> <%= link_to "Edit", edit_user_path(@user) %></div>
这是我点击索引或显示页面中的编辑链接时出现的注册表单的屏幕截图。它正在发出获取请求,但显示新表单而不是表单进行编辑。
这是点击展示页面中的修改链接的日志:
Started GET "/users/17/edit" for at 2013-08-19 08:40:49 +0000
Processing by UsersController#edit as HTML
Parameters: {"id"=>"17"}
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", "17"]]
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = 17 ORDER BY "users"."id" ASC LIMIT 1
Rendered users/_form.html.erb (17.5ms)
Rendered users/edit.html.erb within layouts/application (26.8ms)
Completed 200 OK in 50ms (Views: 47.1ms | ActiveRecord: 0.5ms
users_controller.rb
class UsersController < ApplicationController
before_action :set_user, only: [:show, :edit, :update, :destroy]
before_filter :authenticate_user!, except: [:new, :create]
respond_to :html, :json
def show
end
def edit
end
private
def set_user
@user = User.find(params[:id])
end
end
users / _edit.html.erb 我甚至在表单中指定了url路径,但仍然呈现新表单
form_for(@user, :url => edit_user_path(@user))
用户/ edit.html.erb
<%= render "edit" %>
用户/ index.html.erb
<% @users.each do |user| %>
<div class="btn btn-primary"><%= link_to "Edit", edit_user_path(user) %> </div>
<div class="btn btn-danger"><%= link_to 'Remove', user, method: :delete, data: {confirmation: 'Are you sure'} %></div>
<% end %>
答案 0 :(得分:2)
您正在向编辑用户路径发出POST请求,而此路径是使用GET方法注册的。这就是你得到这个错误的原因。
就个人而言,我不会跳过注册,而是按照Devise wiki中的描述覆盖注册控制器。