我在开发我的第一个 Rails(Ruby 也是如此)应用程序时正在处理的新问题。
我正在使用(按特定顺序):设计、注册、用户
生成 Registration 脚手架/模型后,我将文件从 devise/views/registrations 移动到 /views/registrations。
生成用户脚手架后,我将 edit.html.erb 和 show.html.erb 移动到 /views/users
我没有使用特定的管理员控制器,但我有一些代码可以检查 current_user 的管理员权限,如果是这样,我想让管理员能够编辑任何用户的信息,而无需输入密码。因此,如果 current_user 不是管理员(并且该部分运行正常),我为编辑显示的表单会跳过密码字段。
编辑表单显示正常,并且表单的字段填充有正在编辑的用户(不是 current_user)信息。
我遇到的问题是,当我点击更新时,我收到错误消息,告诉我密码丢失等。
我怀疑这与编辑表单操作(也许还有其他)有关。
这是我在 edit.html.erb 中的表单声明(这是最初由 Devise 创建的原始表单声明,当我将其移至注册然后移至用户视图时,它与文件一起移动):
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
当我使用 firebug 查看表单的 HTML 时,我看到的是:
<form id="new_user" class="new_user" method="post" action="/" accept-charset="UTF-8">
如果我将registration_path更改为edit_user_path:
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
这是我在 HTML 中得到的:
<form id="new_user" class="new_user" method="post" action="/users/user/edit" accept-charset="UTF-8">
另外,当我尝试在这里提交表单时,它告诉我:
No route matches [PUT] "/users/user/edit"
在我的 users_controller.rb 中,我有以下内容(我从注册控制器中删除了编辑和更新方法):
def edit
@user = User.find(params[:id])
end
def update
respond_to do |format|
if @user.update_attributes(params[:user])
format.html { redirect_to root_url, flash[:notice] = SUCCESSFUL_REGISTRATION_UPDATE_MSG }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
仅供参考:这是我生成路线时看到的内容:
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PUT /users/:id(.:format) users#update
cancel_user_registration GET /cancel(.:format) registrations#cancel
user_registration POST / registrations#create
new_user_registration GET /request_invite(.:format) registrations#new
edit_user_registration GET /edit(.:format) registrations#edit
PUT / registrations#update
有任何想法吗?
解决方案
就我而言,由于我使用的是更新,因此解决方案是使用 update_without_password。相反,如果这是新的并且我不想要求密码,那么它将是:save_without_password
def update
@user = User.find(params[:id])
respond_to do |format|
if @user.update_without_password(params[:user])
format.html { redirect_to root_url, flash[:notice] = SUCCESSFUL_REGISTRATION_UPDATE_MSG }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end