Обработка ошибок 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
Что мне не хватает? Любая помощь будет высоко оценена.
Приветствия
Ответы
Ответ 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