如何在Rails中将自定义错误返回到我的表单?

Bob*_*Bob 3 forms validation ruby-on-rails

我在一个用户输入邮寄地址的网站上有一个简单的表格.

我有一个服务可以验证这个地址并返回各种响应,包括Success,Suspect或Invalid,以及返回该地址的完整和最完整的邮政编码.如果响应是"成功",那么我将它保存到数据库.如果响应是"可疑",那么我将更新zip字段并要求他们确认.如果回复是"无效",那么我将返回一条错误消息,要求他们亲自与我们联系.

我正在尝试设置我的rails创建操作,以便它调用我的服务(例如http:/addresssValidator.com),我想通知用户他们是否有有效地址,并更新zip使用建议的邮政编码.

然而,在rails中寻找地址验证似乎只给了我在rails中使用内置错误和验证系统的API,而不是如何将我自己的自定义结果返回到表单.

我怎样才能做到这一点?

以下是我的代码:

def create
  @valid = validate_address
    @address = Address.new(address_params)
  if @valid
    if @address.save
      redirect_to "/survey/success"
    else
      p @address.errors
      respond_to do |format|
        format.json {render json: @address.errors}
        format.html {render "/survey/failure"}

      end

    end
  else
    ##//Display errors
  end

  end 

def validate_address

@api_key = "my_api_key"
HTTParty.post("http://addressValidator.com",
              {
                  :body => [
                      "StreetAddress" =>  params[:address][:address_line_2] + " " + params[:address][:address_line_1],
                      "City" => params[:address][:city],
                      "PostalCode" => params[:address][:zip],
                      "State" => params[:address][:state],
                      "CountryCode" => params[:address][:country],
                      "Locale" => "en" ].to_json,
                  :APIKey => @api_key ,
                  :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json'}
              })


return false;
##//return actual results from validator
  end
Run Code Online (Sandbox Code Playgroud)

Ziv*_*ili 5

如果要向特定字段添加自定义错误:

@address.errors[:FIELD_NAME] << "Custom Error Message"
Run Code Online (Sandbox Code Playgroud)

这样,错误就会添加到您拥有的实例中,并在其他错误出现时显示在表单中.

如果您只想显示错误,可以将其添加到flash[:error]以下内容中:

flash[:error] = "Invalid address"
Run Code Online (Sandbox Code Playgroud)

如果你想让错误转移到下一个方法(就像你将在它之后使用重定向),或者:

flash.now[:error] = "Invalid address" 
Run Code Online (Sandbox Code Playgroud)

如果您希望错误仅在当前操作中可用.正如@illusionist在评论中所说.

并在HTML代码中,检查它是否存在,如果是,打印它:

<% if flash[:error] %>
  <%= flash[:error] %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

在两种方式中,您都可以添加错误@valid.

如果要存储新zip,请添加@address.zip = @valid.zip.这样它就会在表格中显示出来.