这是我的 users/edit.html/erb 中的内容
<%= form_for(resource, :as => resource_name, :url => user_path(resource_name), :html => { :method => :put }) do |f| %>
我的用户路线:
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PUT /users/:id(.:format) users#update
method => put,所以使用路由信息,我期望 HTML 动作是 /users/:id
这是 users/edit.html.erb,我希望来自 id 的 HTML 是 edit_user_id,类是 edit_user
这是显示表单时我在 HTML 中实际得到的内容(使用 firebug):
<form id="new_user" class="new_user" method="post" action="/users/user" accept-charset="UTF-8">
HTML不应该是(假设用户ID为1):
<form id="edit_user_1" class="edit_user" method="post" action="/users/1" accept-charset="UTF-8">
在我的 routes.rb 文件中,我有:
resources :users, only: [:show, :edit, :update]
devise_for :users, :controllers => { :registrations => 'registrations', :confirmations => 'confirmations' }, :path => '', :path_names => { :sign_in => "login", :sign_up => "request_invite" }
编辑 - 对维克多评论的回应:
我确实将用户帮助更改为:
def resource
@resource ||= User.find(params[:id])
end
因此,根据 API 文档,这也应该选择 /users/:id 作为一个动作,因此,HTML 现在应该如下所示:
<form id="edit_user_1" class="edit_user" method="post" action="/users/1" accept-charset="UTF-8">
相反,它是:
<form id="edit_user" class="edit_user" method="post" action="/users/user" accept-charset="UTF-8">
因此,当用户控制器开始行动时,会触发以下代码:
def update
@user = User.find(params[:id])
并且它认为(从表单的操作),我传递的 id 是用户这个词,所以当我点击更新时,我期望收到以下错误消息:
找不到 id=user 的用户
这正是我得到的错误。任何额外的见解?
最终答案:
在 users_helper.rb 中:
def resource
@resource ||= User.find(params[:id])
end
在 users/edit.html.erb 中
资源名称, :html => { :method => :put }) 做 |f| %>