首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NoMethodError: HTTParty的未定义方法“提交”

NoMethodError: HTTParty的未定义方法“提交”
EN

Stack Overflow用户
提问于 2018-07-19 20:53:17
回答 1查看 460关注 0票数 0

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

这就是请求的样子:

代码语言:javascript
复制
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服务发出请求。

代码语言:javascript
复制
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

控制器

代码语言:javascript
复制
class FormsController < ApplicationController
  def display_form
    @form = FormStack::Form.new().create_form
  end

  def create
    @form.submission
    redirect_to 'localhost:3000'
  end
end

这是路线

代码语言:javascript
复制
get '/forms/display_form', to: 'forms#display_form'
post '/forms/submit', to: "forms#create"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-20 01:41:52

首先,我有几件一般的红宝石东西给你:

  1. 当您调用FormStack::Form.new().create_form时,实际上不需要在.new之后使用.new -- ruby知道不带参数地调用方法,即使排除了双亲。
  2. 我不太清楚您是如何从FormsController::display_form中调用FormsController::create的,但现在我假设您正在使用魔术。

不管怎样,关于我的答案。正如您的错误消息所述,错误与您在没有submission方法的东西上调用submission有关。有了这些知识,我们就可以在这一行中查看您正在调用提交的对象:

代码语言:javascript
复制
@form.submission

看起来你在@form上打电话给@form。好吧,让我们来看看您声明@form的位置

代码语言:javascript
复制
@form = FormStack::Form.new().create_form

让我们把那份声明分成几个部分。首先,使用FormStack::Form.new()创建一个新的FormStack::Form实例。到目前一切尚好。FormStack::Form上定义了一个submission方法。但是,你在上面打电话给create_form。那么,让我们看看create_form所做的事情:

代码语言:javascript
复制
def create_form
  self.class.get(relative_uri, headers: headers)
end

create_form调用HTTParty,get提供的方法。get方法返回一个HTTParty::Response对象。因此,让我们解析再次设置@form的行。你要做的就是:

代码语言:javascript
复制
@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

正如您所看到的,最后我们将@form设置为HTTParty::Reponse的实例,而不是FormStack::Form,而且由于HTTParty::Response没有submission方法,所以会出现错误。

基于这一探索,我们可以看到修复方法是将@form设置为FormStack::Form对象,我们可以通过将display_form操作更改为:

代码语言:javascript
复制
def display_form
  @form = FormStack::Form.new
  @form.create_form
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51431536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档