Подтвердить что ты не робот

Обработка ошибок ActiveResource

Я искал какое-то время, но пока не могу найти удовлетворительного ответа. У меня есть два приложения. 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

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

Приветствия

4b9b3361

Ответ 1

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

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

render :json => {:errors => user.errors}, :status => :unprocessable_entity

Ответ 2

В коде:

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" }

Ответ 3

Это решение сработало для меня: fooobar.com/info/513856/...

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

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