ruby-on-rails - Rails 无法识别从 Ruby 脚本发布的参数

标签 ruby-on-rails ruby ruby-on-rails-3

我有一个带有 create 方法的 Rails Controller ,我想从 Ruby 脚本向它进行 POST。当我从基于浏览器的 POST 中点击此方法时,params 哈希值已正确设置,但当我从脚本中点击该方法时,哈希值为空。我已经禁用了protect_from_forgery,并且该方法确实被调用了;它只有一个空的params。这是 Controller 方法:

def create
  logger.info "GOT: #{request.body.read}"
  logger.info "PARAMS: #{params.inspect}"
  az = AreaZip.new(params[:area_zip])
  if az.save
    respond_to { |format|
      format.js { render :json => {:id => az.id} }
    }
  else
    logger.warn "FAILED creating AreaZip: #{az.errors.inspect}"
    respond_to { |format|
      format.js { render :json => {:errors => az.errors} }
    }
  end
end

这是执行发布的代码:

def self.post(url, path, params={})
  url = "#{url}#{path}"
  uri = URI.parse(url)
  headers = {
    'Content-Type' => 'text/plain; charset=utf-8',
    'Authorization' => "Basic #{Base64.encode64('censored:censored').strip}",
  }

  http = Net::HTTP.new(uri.host, uri.port)
  post_data = params.map {|k,v| "#{CGI::escape(k.to_s)}=#{CGI::escape(v.to_s)}" }.join("&")
  resp, data = http.post(uri.path, post_data, headers)
  return JSON.parse(data)
end   

以下是我发布到 nc -l -p 12345 时看到的内容:

POST /admin/area_zips HTTP/1.1
Accept: */*
Connection: close
Content-Type: text/plain; charset=utf-8
Authorization: Basic sdfnjjsadf[censored]jklsdfsjdfkj
Content-Length: 54
Host: localhost:12345

area_zip%5Bzip%5D=15068-4838&area_zip%5Barea_id%5D=334

如果我发布到我的 Rails 应用程序,我的日志会显示以下内容:

Started POST "/admin/area_zips" for 127.0.0.1 at Fri Jul 29 09:45:05 -0400 2011
  Processing by Admin::AreaZipsController#create as */*
Asking for HTTP basic authentication to reach admin page
GOT: area_zip%5Bzip%5D=15068-6851&area_zip%5Barea_id%5D=334
PARAMS: {"action"=>"create", "controller"=>"admin/area_zips"}
  SQL (0.2ms)  BEGIN
  SQL (0.2ms)  ROLLBACK
FAILED creating AreaZip: #<OrderedHash {:area=>["can't be blank"], :zip=>["can't be blank"]}>
Completed 200 OK in 70ms (Views: 41.4ms | ActiveRecord: 1.2ms)

正如您所看到的,Rails 获取了 POSTed 数据,但它没有使用它来设置 params。知道为什么吗?

最佳答案

好的,我解决了这个问题。事实证明问题出在 Content-Type header 上。我需要将其设置为 application/x-www-form-urlencoded。其实我以为我在这样做,但显然不是。旧的 Content-Type 值是一个复制粘贴错误,是我的 get 方法中的代码遗留下来的。

关于ruby-on-rails - Rails 无法识别从 Ruby 脚本发布的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6874180/

相关文章:

ruby-on-rails-3 - Ruby on Rails 使用 PostgreSQL 进行计数和分组

ruby-on-rails - 确保模型属性始终小写和剥离的最佳方法?

ruby-on-rails - 未初始化的常量 Test::Unit::TestResult::TestResultFailureSupport

ruby-on-rails - ActiveModel::MissingAttributeError:在 Spree 中使用 has_many Assosiacion 时,无法写入未知属性 'product_id'

ruby - 在YAML转储后立即加载ruby YAML

ruby-on-rails - Rails 没有渲染我的 .js.erb 文件

ruby-on-rails - 运行 "bin/rake assets:precompile"时未设置 I18n 加载路径!

ruby-on-rails - 这是做仪表板最 'Rails'的方法吗?

ruby-on-rails - 仅在生产中,Sidekiq 启动延迟作业但不发送电子邮件

ruby - 我可以确保所有测试都包含测试/单元中的断言吗?