路由错误早报/ PUT请求(乘客头)(Routing Error with Post/Put req

2019-07-17 18:18发布

我碰到一个奇怪的问题,之后一堆研究不能得到任何接近。 我已经得到了通过Carrierwave上传文件几种形式。 当我上传的信息,该路线的一部分被切断(我认为)。

例如,我有一个多部分的形式提交到:

HTTPS:/域名/程序/ 223 / add_file为POST

但在提交我得到的错误

无路由匹配[POST] “/ 223 / add_file”

即使有什么在我的地址栏是一个完整的路线。 如果提交完整的路线为GET请求它工作正常。 当我运行耙路线的路线显示出来就好了。

下面是我的路线的一个子集:

resources :programs do
  match "add_file" => "programs#add_file"

如果它的事项,我运行的Rails 3.2.2与Apache的乘客。 该问题只发生这种生产服务器上,从来没有在开发中。

有任何想法吗? 我被困在这一个,因为它影响多条路线,我已经试过只定义为形式,没有运气的自定义路线。

更新:当我删除多部分=>真或从形式file_field_tag它解决了这个问题。 这仍然是一个问题,但似乎少约比约与上传文件的形式进行路由选择。

Answer 1:

创建passenger_extension.rblib使用此代码文件夹:

乘客3

module PhusionPassenger
  module Utils

    protected

    NULL = "\0".freeze

    def split_by_null_into_hash(data)
      args = data.split(NULL, -1)
      args.pop
      headers_hash = Hash.new
      args.each_slice(2).to_a.each do |pair|
        headers_hash[pair.first] = pair.last unless headers_hash.keys.include? pair.first
      end
      return headers_hash
    end

  end
end

乘员5

module PhusionPassenger
  module Utils

    # Utility functions that can potentially be accelerated by native_support functions.
    module NativeSupportUtils
      extend self

      NULL = "\0".freeze

      class ProcessTimes < Struct.new(:utime, :stime)
      end

      def split_by_null_into_hash(data)
        args = data.split(NULL, -1)
        args.pop
        headers_hash = Hash.new
        args.each_slice(2).to_a.each do |pair|
          headers_hash[pair.first] = pair.last unless headers_hash.keys.include? pair.first
        end
        return headers_hash
      end

      def process_times
        times = Process.times
        return ProcessTimes.new((times.utime * 1_000_000).to_i,
          (times.stime * 1_000_000).to_i)
      end
    end

  end # module Utils
end # module PhusionPassenger

然后在“配置/ application.rb中”做:

class Application < Rails::Application
  ...
  config.autoload_paths += %W(#{config.root}/lib)
  require 'passenger_extension'
end

然后重新启动Web服务器。

注意:我不知道,这不会破坏任何其他功能,因此使用它自己的风险,请让你找到这种做法造成任何伤害我。



Answer 2:

这里的一个问题是你没有指定路线是否在收集或成员定义。 其中哪一个是正确的路径?

programs/:id/add_file

programs/add_file

您应该构建您的路线是这样的:

resources :programs do
  post 'add_file', :on => :member
end

要么

resources :programs do
  member do
    post 'add_file'
  end
end

以上将POST请求的programs/:id/add_file并将它们发送到ProgramsController.add_fileparams[:id]作为程序ID。

如果你想在此集合,你可以这样做:

resources :programs do
  post 'add_file', :on => :collection
end

要么

resources :programs do
  collection do
    post 'add_file'
  end
end

这将需要在POST请求的programs/add_file并将它们发送到ProgramsController.add_file ,但没有params[:id]将被设置。

一般来说,你应该总是指定路由是否在收集或成员,并应指定的动词的路线应该接受(即使用“获取”或“邮报”等来代替“匹配”)。

试试上面,看看是否能解决你的问题,如果不是请让我知道,我会再看看。



Answer 3:

我想你可能需要添加

:via => [:post]

你的路径确定。 这似乎很奇怪,它会发展,而不是生产工作,但据我所知轨路由,你已经添加的匹配只会获得响应。

试着改变你的比赛

match "add_file" => "programs#add_file", :via => [:post]

此外,根据刚刚由安德鲁提交的答案,你可能使用过的成员说明是明确的事实,操作发生在特定程序与特定的ID,而不是收集更好。 还应该保存在你的add_file方法,这可能是努力得到的URL参数id一些代码。



文章来源: Routing Error with Post/Put requests (Passenger Headers)