Rails 4 - 没有路由匹配自定义路由上的PATCH

时间:2014-07-22 07:06:47

标签: ruby-on-rails routes

我需要一个用于更改当前用户个人资料的页面,如果网址为/user/:id则很奇怪,因此我将其映射到/settings

get "/settings", to: "users#edit", as: "settings_user"

但是当我提交表单时,我收到了这个错误:

Routing Error

No route matches [PATCH] "/settings"

奇怪的是,如果我按回并重新提交表格,它将提交正常。

如果我转到另一个页面然后返回到表单,它会在第一次尝试时出错,但在第二次尝试时工作正常。

我的控制器:

class UsersController < ApplicationController
  ...
  def edit
    @user = current_user #this is the cache of currently logged in user
  end

  def update
    @user = User.find(params[:id])
    if @user.update(user_params)
     redirect_to settings_user_path, notice: "Profile has been saved"
    end
  end

  private
    def user_params
      params.require(:user).permit(:id, :name, :email, :bio)
    end
end

我的观点:

<%= form_for @user do |f| %>
  ...
<% end %>

注意

使用默认路由的其他页面(例如我的“产品”页面)工作正常,因此不是Rails配置问题。

2 个答案:

答案 0 :(得分:1)

<强>设计

我猜您正在使用devise(根据您使用current_user的方式) - 所以您可能希望查看Devise'custom routing paths。虽然这不会为您的user对象提供路由结构,但它可能会在某个时候派上用场:

#config/routes.rb
devise_for :users, path: "auth", path_names: { sign_in: 'login', sign_out: 'logout', password: 'secret', confirmation: 'verification', unlock: 'unblock', registration: 'register', sign_up: 'cmon_let_me_in' }

-

<强>路线

如果您想管理user对象,最好使用resources路由定义:

#config/routes.rb
resources :users, only: [], path: "" do
   collection do
       get :settings, action: :edit
       match :settings, action :update, via: [:patch, :put]
   end
end

您遇到的问题是form认为它应该将update请求发送给/settings

No route matches [PATCH] "/settings"

解决这个问题的方法是为patch提供路由(如上所示),或者定义表单的url参数:

<%= form_for @user, url: your_update_path do |f| %>

-

希望这有帮助吗?

答案 1 :(得分:0)

此问题仅发生在Chrome 37 Beta上。我恢复了Chrome 36 Release,一切正常。

我想我不会再次将beta版用于日常使用。