如何单独处理单个用户模型数据的更新:用户信息,密码,额外信息

时间:2012-02-25 20:02:21

标签: ruby-on-rails

我想为用户提供单独的页面/对话框来编辑自己的信息。但是,信息保存在单个模型中(称为用户)。现在我正在尝试找到处理部分更新调用的最佳方法。我的代码目前:

  def edit
    render :layout=>!request.xhr?
  end

  def edit_password
    render :layout=>!request.xhr?
  end

  def edit_extra
    unless @user.extra
      @user.build_extra
      @user.extra.value = 2047
    end

    render :layout=>!request.xhr?
  end

  def update
    respond_to do |format|
      if @user.update_attributes(params[:user])
        format.html { redirect_to @user, :notice => 'User was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render :action => "edit", :layout=>!request.xhr? }
      end
    end
  end

问题是,方法中的所有表单(edit,edit_password和edit_extra)都会调用update方法。但是,有两个问题:

  1. 如果未验证数据解析,则会向用户显示“编辑”表单,该表单不正确。
  2. 我希望对额外数据进行密码确认。用户不应该编辑该信息,除非他们提供正确的密码。
  3. 我想制作更通用的解决方案,而不仅仅是复制更新代码。最大的问题是根据当前操作呈现正确的布局(edit,edit_password)。

1 个答案:

答案 0 :(得分:0)

目前,我通过创建将在更新中处理的单独的edit_section参数解决了这个问题。

  def update
    respond_to do |format|
      if @user.update_attributes(params[:user])
        format.html { redirect_to @user, :notice => (t :actionsuccesful) }
        format.json { head :no_content }
      else
        action = if params[:edit_section] then "edit_" + params[:edit_section] else "edit" end
        format.html { render :action => action, :layout=>!request.xhr? }
      end
    end
  end

表格(edit_password等)

=form_for(@user, :remote => true) do |f|
  = hidden_field_tag :edit_section, "password"