我需要一个用于更改当前用户个人资料的页面,如果网址为/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配置问题。
答案 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版用于日常使用。