【问题标题】:rails-4 devise + user controller edit route redirecting to the wrong placerails-4 设计 + 用户控制器编辑路由重定向到错误的地方
【发布时间】:2013-08-18 20:47:18
【问题描述】:

我在我的应用程序和自定义用户控制器中使用设计 gem。我在节目和索引页面中都有编辑用户的链接。登录后,如果我单击 users/index.html.erb 或 users/edit.html.erb 中的编辑链接,即使发送了 GET 请求,它也会重定向到用户新表单。

在路由中,我跳过了可注册的,因为我正在使用用户控制器来处理它并且它工作正常。

这是路线

devise_for :users, :path_prefix => 'd', skip: [:registrations], controllers: {sessons: "sessions"}
resources :users

rake 路线 | 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 %>

【问题讨论】:

    标签: devise ruby-on-rails-3.2 ruby-on-rails-4 rails-routing


    【解决方案1】:

    您正在向编辑用户路径发出 POST 请求,而此路径已使用 GET 方法注册。这就是您收到此错误的原因。

    就我个人而言,我不会跳过注册,而是按照 Devise wiki 中的描述覆盖注册控制器。

    【讨论】:

    • 谢谢贾斯汀。错误说是一个 POST 请求,但是当我这样做时 rake routes | grep edit_user 它显示路由生成的是 GET 请求。所以 grep 的响应是 edit_user GET /users/:id/edit(.:format) users#edit 所以我真的不知道它在什么时候将自己切换为 POST 请求。
    • 调用button_to时会生成一个POST链接。
    • 谢谢@sevenseacat。我刚刚返回了我的 user/show.edit.erb,昨天我将链接更改为这个
    • 不会引起这样的问题。
    • 感谢@sevenseacat,查看更新的清洁堆栈跟踪,编辑链接不再发出发布请求,即使发出 GET 请求,它仍然显示新表单。
    猜你喜欢
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 2015-03-24
    相关资源
    最近更新 更多