Ruby - cURL抛出未定义的方法`post' for nil:NilClass错误

时间:2017-04-08 18:21:21

标签: ruby-on-rails ruby http curl post

当我尝试运行一个向我的Ruby on Rails网站发送POST请求的ruby脚本文件时,我的网站日志中出现undefined method 'posts' for nil:NilClass错误。 它也是下面的错误:

app/controllers/posts_controller.rb:25:in `create'

ruby​​脚本:

require 'net/http'
require 'uri'

uri = URI.parse("https://myapp.com/posts")
request = Net::HTTP::Post.new(uri)
request.set_form_data(
"title" => "blatest",
)

req_options = {
use_ssl: uri.scheme == "https",
}

response = Net::HTTP.start(uri.hostname, uri.port, req_options) do   |http|
http.request(request)
end

我的posts_controller.rb创建方法:

def create
  @post = current_user.posts.build(post_params) <<< line 25
  respond_to do |format|
    if @post.save
      format.html { redirect_to posts_path, notice: 'New post' }
      format.json { render :show, status: :created, post: @post }
    else
      format.html { render :new }
      format.json { render json: @post.errors, status:  :unprocessable_entity }
    end
  end
end

我正在使用表单和多部分表单,但首先只测试1个参数&#39; title&#39;当我通过网站表单创建帖子时,它有用。但卷曲请求没有做任何事情。请帮助...... :(

1 个答案:

答案 0 :(得分:0)

posts上调用了current_user方法,但由于帖子请求来自您的脚本,因此没有当前用户或会话。

您将不得不创建一个可供您的脚本使用的身份验证策略。

或者,如果您可以将此控制器操作成功响应匿名请求,则必须以另一种方式传递用户,例如添加参数。

Something like this:

def create
  user = current_user || User.find(params[:post][:user_id])
  @post = user.posts.build(post_params)
  respond_to do |format|
    if @post.save
      format.html { redirect_to posts_path, notice: 'New post' }
      format.json { render :show, status: :created, post: @post }
    else
      format.html { render :new }
      format.json { render json: @post.errors, status:  :unprocessable_entity }
    end
  end
end

然后将'user_id'添加到脚本

require 'net/http'
require 'uri'

uri = URI.parse("https://myapp.com/posts")
request = Net::HTTP::Post.new(uri)
request.set_form_data(
"title" => "blatest",
"user_id" => '1'
)

req_options = {
use_ssl: uri.scheme == "https",
}

response = Net::HTTP.start(uri.hostname, uri.port, req_options) do   |http|
http.request(request)
end

我不会将其留在实时网络应用中,因为您正在创建一个控制器操作,允许脚本以任何没有安全性的用户创建帖子。容易被滥用的目标。但是,这应该让您对概念的测试工作。确保事后加强安全性。