当我尝试运行一个向我的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;当我通过网站表单创建帖子时,它有用。但卷曲请求没有做任何事情。请帮助...... :(
答案 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
我不会将其留在实时网络应用中,因为您正在创建一个控制器操作,允许脚本以任何没有安全性的用户创建帖子。容易被滥用的目标。但是,这应该让您对概念的测试工作。确保事后加强安全性。