Обработка ошибок ActiveResource - PullRequest
10 голосов
/ 22 июня 2010

Я долго искал, но пока не могу найти удовлетворительный ответ.У меня есть два приложения.FrontApp и BackApp.FrontApp имеет активный ресурс, который имитирует модель в BackApp.Все проверки на уровне модели находятся в BackApp, и мне нужно обработать эти проверки BackApp в FrontApp.

У меня есть следующий код активного ресурса:

class RemoteUser < ActiveResource::Base
  self.site = SITE
  self.format = :json
  self.element_name = "user"
end

.

class User < ActiveRecord::Base

  attr_accessor :username, :password

  validates_presence_of :username
  validates_presence_of :password
end

Всякий раз, когда я создаю новый RemoteUser во фронт-приложении;Я звоню. Сохраните это.например:

user = RemoteSession.new(:username => "user", :password => "")
user.save

Однако, поскольку пароль пуст, мне нужно передать ошибки в FrontApp из BackApp.Это не происходитЯ просто не понимаю, как это сделать успешно.Это должен быть общий сценарий интеграции;но, кажется, нет хорошей документации для этого?

Мой контроллер покоя, который действует как прокси, выглядит следующим образом:

class UsersController < ActionController::Base
  def create
    respond_to do |format|
      format.json do
        user = User.new(:username => params[:username], :password => params[:password])
        if user.save
          render :json => user
        else
          render :json => user.errors, :status => :unprocessable_entity
        end
      end
    end
  end
end

Что мне не хватает?Любая помощь будет высоко ценится.

Ура

Ответы [ 3 ]

13 голосов
/ 11 июля 2010

Из исходного кода rails я выяснил, что причина, по которой ActiveResource не получал ошибок, заключается в том, что я не назначал ошибки тегу "errors" в json. Это недокументировано, но обязательно. :)

Итак, мой код должен был быть:

render :json => {:errors => user.errors}, :status => :unprocessable_entity
1 голос
/ 05 февраля 2014

Это решение сработало для меня: https://stackoverflow.com/a/10051362/311744

действие по обновлению:

def update
    @user = User.find(params[:id])

    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' }
        format.json {

          render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

Вызывающий контроллер:

@remote_user = RemoteUser.find(params[:id])
if (@remote_user.update_attributes(params[:remote_user]))
  redirect_to([:admin, @remote_user], notice: 'Remote user was successfully updated.')
else
  flash[:error] = @remote_user.errors.full_messages
  render action: 'edit'
end
1 голос
/ 22 июня 2010

В коде:

class UsersController < ActionController::Base
  def create
    respond_to do |format|
      format.json do
        user = User.new(:username => params[:username], :password => params[:password])
        if user.save
          render :json => user
        else
          render :json => user.errors, :status => :unprocessable_entity
        end
      end
    end
  end
end

попробуйте заменить

user = User.new(:username => params[:username], :password => params[:password])

на

user = User.new(params[:user])

Ваша модель с активным ресурсом передает параметры, подобные хэшу выше:

:user => { :username => "xpto", :password => "yst" }
...