Как обрабатывать обновление данных однопользовательской модели отдельно: информация о пользователе, пароль, дополнительная информация - PullRequest
1 голос
/ 26 февраля 2012

Я хочу предоставить пользователям отдельные страницы / диалоги для редактирования их собственной информации. Тем не менее, информация хранится в одной модели (называется пользователь). Теперь я пытаюсь найти лучший подход для обработки вызовов обновления от частичных. Мой код в настоящее время:

  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. Я хочу получить подтверждение пароля на дополнительные данные. Пользователь не должен иметь возможность редактировать эту информацию, если он не введет правильный пароль.

Я хотел бы сделать более обобщенное решение, чем просто дублирование кода обновления. Самая большая проблема - рендеринг правильного макета (edit, edit_password) на основе текущего действия.

1 Ответ

0 голосов
/ 29 февраля 2012

Пока что я решил проблему, создав отдельный параметр 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...