【问题标题】:ActiveResource error handlingActiveResource 错误处理
【发布时间】:2011-03-06 21:21:15
【问题描述】:

我一直在寻找一段时间,但我还没有找到满意的答案。我有两个应用程序。 FrontApp 和 BackApp。 FrontApp 有一个模仿 BackApp 模型的活动资源。所有模型级别的验证都在 BackApp 中,我需要在 FrontApp 中处理这些 BackApp 验证。

我有以下活动资源代码:

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 时;我打电话给 .save 。例如:

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

但是,由于密码为空,我需要将错误从 BackApp 传递回 FrontApp。这没有发生。我只是不明白如何成功地做到这一点。这必须是一个常见的集成场景;但似乎没有一个好的文档?

我作为代理的restful控制器如下:

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

我错过了什么?任何帮助将不胜感激。

干杯

【问题讨论】:

    标签: ruby-on-rails ruby error-handling integration activeresource


    【解决方案1】:

    从 rails 源代码我发现 ActiveResource 没有出错的原因是因为我没有将错误分配给 json 中的“错误”标签。它没有记录,但需要。 :)

    所以我的代码应该是:

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

    【讨论】:

    • 'format.json { render :json => {:errors => @customer.errors}, :status => :unprocessable_entity}' ----> 这将工作.....我也遇到了同样的问题,因为我使用的是 @customer.errors.full_messages 之类的代码,它没有分配和返回活动资源应用程序
    【解决方案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】:

    这个解决方案对我有用: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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多