Rails:用户使用Devise编辑表单和密码

时间:2012-06-07 02:32:15

标签: ruby-on-rails devise passwords

我正在处理新问题,因为我开发了我的第一个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  

1 个答案:

答案 0 :(得分:0)

请记住,您的用户模型并不是特别的,因为设计正在处理逻辑。您可以轻松创建新的控制器/视图以编辑用户配置文件,并为其提供管理员访问权限。 (这就是我所做的,我不喜欢用户必须输入密码才能进行任何更改)

$ rails g controller users
resources :users, :only => [:edit, :update]

之后,它与任何控制器/视图

几乎相同