我正在处理新问题,因为我开发了我的第一个Rails(Ruby以及那个问题)应用程序。
我正在使用(按照特定顺序):设计,注册,用户
在我生成注册脚手架/模型后,我将文件从设计/视图/注册移动到/ 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
答案 0 :(得分:0)
请记住,您的用户模型并不是特别的,因为设计正在处理逻辑。您可以轻松创建新的控制器/视图以编辑用户配置文件,并为其提供管理员访问权限。 (这就是我所做的,我不喜欢用户必须输入密码才能进行任何更改)
$ rails g controller users
resources :users, :only => [:edit, :update]
之后,它与任何控制器/视图
几乎相同