代码之家  ›  专栏  ›  技术社区  ›  Steven Aguilar

nomethodError:httparty的未定义方法“submission”

  •  0
  • Steven Aguilar  · 技术社区  · 7 年前

    我目前正在开发一个Rails应用程序,在该应用程序中,我试图向FormStack API提交一个表单。请求如下。

    请求如下所示:

    POST /api/v2/form/12345/submission.json HTTP/1.1
    Host: www.formstack.com
    Authorization: Bearer YOUR_APP_OAUTH_TOKEN
    Accept: application/json
    Content-Type: application/json
    
    field_12345=Example&field_12346=Answer
    

    我正在尝试在我创建的库上使用httparty来实现这个API服务的请求。

    module FormStack
    
     class Form
        include HTTParty
        attr_reader :form_id
        base_uri "https://www.formstack.com/api/v2"
    
        def initialize
          @access_token = ENV.fetch('FORMSTACK_ACCESS_TOKEN')
          @form_id      = ENV.fetch('FORMSTACK_FORM_ID')
        end
    
        def create_form
          self.class.get(relative_uri, headers: headers)
        end
    
        def submission
          self.class.post(create_submission_uri, headers: headers, query: query)
        end
    
        private
    
        def relative_uri
          "/form/#{@form_id}/field.json"
        end
    
        def create_submission_uri
          "form/#{@form_id}/submission.json"
        end
    
        def headers
          {
            "Accept" => "application/json",
            "Content-Type"  => "application/json",
            "Authorization" => "Bearer #{@access_token}"
          }
        end
    
        def query
          {
            "field_66563890" => "blah",
            "field_66563757" => "something"
          }
        end
      end
    end
    

    控制器

    class FormsController < ApplicationController
      def display_form
        @form = FormStack::Form.new().create_form
      end
    
      def create
        @form.submission
        redirect_to 'localhost:3000'
      end
    end
    

    这是路线

    get '/forms/display_form', to: 'forms#display_form'
    post '/forms/submit', to: "forms#create"
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   thesecretmaster azazdeaz    7 年前

    首先,我为你准备了一些普通的红宝石:

    1. 当你打电话的时候 FormStack::Form.new().create_form 你其实不需要 () 之后 .new --Ruby知道调用不带参数的方法,即使排除parens。
    2. 我不太确定你怎么打电话 FormsController::display_form FormsController::create 但是现在我假设你在使用魔法。

    不管怎样,我的回答是。当您的错误消息声明时,该错误与您调用 submission 在一些没有 提交 方法。有了这些知识,我们可以看到您在这行中调用提交的对象:

    @form.submission
    

    你好像在打电话 提交 @form . 好吧,我们去看看你申报的地方 @表格 :

    @form = FormStack::Form.new().create_form
    

    让我们把那个声明分解成几个部分。首先,用 FormStack::Form.new() ,您正在创建的新实例 FormStack::Form . 到现在为止,一直都还不错。 窗体堆栈::窗体 有一个 提交 方法。但是你打电话来 create_form 在上面。那么,让我们看看 创建表格 做:

    def create_form
      self.class.get(relative_uri, headers: headers)
    end
    

    创建表格 调用httparty提供的方法, get . 这个 得到 方法返回 HTTParty::Response 对象。那么,让我们分析一下您设置的行 @表格 再一次。分解,你要做的是:

    @form = FormStack::Form # This line sets the variable to a constant
    @form = @form.new # This line sets the variable to be an instance of FormStack::Form
    @form = @form.create_form # This line sets @form to be an instance of HTTParty::Reponse
    

    正如你所看到的,在我们设置的最后 @表格 到的一个实例 HTTParty::Reponse 而不是 窗体堆栈::窗体 因为没有 提交 方法 httparty::响应 这就是你得到错误的原因。

    基于这种探索,我们可以看到解决方法是 @表格 到A 窗体堆栈::窗体 对象,我们可以通过更改 display_form 拟采取的行动:

    def display_form
      @form = FormStack::Form.new
      @form.create_form
    end
    
    推荐文章