1

我在开发我的第一个 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  
4

1 回答 1

0

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

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

之后,它与任何控制器/视图几乎相同

于 2012-06-07T04:03:29.900 回答