2012-02-25 51 views
1

我想爲用戶提供單獨的頁面/對話框來編輯他們自己的信息。但是,信息保存在單個模型(稱爲用戶)中。現在我試圖找到處理partials更新調用的最佳方法。目前我的代碼:如何分別處理單個用戶模型數據的更新:用戶信息,密碼,額外信息

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_password和edit_extra)調用Update方法。但是,有兩個問題:

  1. 如果數據解析未驗證,用戶會看到「編輯」窗體,這是不正確的。
  2. 我想對額外的數據進行密碼確認。用戶不應該能夠編輯該信息,除非他們提供了正確的密碼。

我想製作更多的通用解決方案,而不僅僅是重複更新代碼。最大的問題是根據當前操作呈現正確的佈局(edit,edit_password)。

回答

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"