5

私は奇妙な問題に遭遇しました、そしてたくさんの研究の後、これ以上近づくことができません。Carrierwave経由でファイルをアップロードするフォームがいくつかあります。情報をアップロードすると、ルートの一部が途切れてしまう(と思います)。

たとえば、次の宛先に送信するマルチパートフォームがあります。

https:/ domain / programs / 223 / add_file as POST

しかし、送信時にエラーが発生します

[POST] "/ 223/add_file"に一致するルートがありません

私のアドレスバーにあるのは完全なルートですが。また、ルート全体をGETリクエストとして送信すると、正常に機能します。レーキルートを実行すると、ルートは問題なく表示されます。

これが私のルートのサブセットです:

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

重要な場合は、ApacheでPassengerを使用してRails3.2.2を実行しています。問題はこの本番サーバーでのみ発生し、開発中は発生しません。

何か案は?複数のルートに影響するため、これに固執しています。運が悪かったので、そのフォーム専用のカスタムルートを定義しようとしました。

更新: マルチパート=> trueまたはfile_field_tagをフォームから削除すると、問題が修正されます。それはまだ問題ですが、ファイルがアップロードされたフォームよりもルーティングに関するものではないようです。

4

3 に答える 3

6

次のコードを使用してフォルダに作成passenger_extension.rbします。lib

乗客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

そして、「config/application.rb」で次のようにします。

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

次に、Webサーバーを再起動します。

注意:これが他の機能を壊さないかどうかはわかりませんので、自己責任で使用してください。このアプローチによる害が見つかった場合はお知らせください。

于 2013-03-08T11:48:15.443 に答える
0

ここでの1つの問題は、ルートがコレクションで定義されているかメンバーで定義されているかを指定していないことです。これらのどれが正しいルートですか?

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

上記はで投稿リクエストを受け取り、プログラムIDとしてprograms/:id/add_fileに送信します。ProgramsController.add_fileparams[:id]

コレクションでこれが必要な場合は、次のようにすることができます。

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

また

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

これはで投稿リクエストを受け取りprograms/add_file、に送信しますがProgramsController.add_file、設定されませんparams[:id]

一般に、ルートがコレクションまたはメンバーのどちらにあるかを常に指定する必要があります。また、ルートが受け入れる動詞を指定する必要があります(つまり、「match」の代わりに「get」または「post」などを使用します)。

上記を試して、問題が解決するかどうかを確認してください。解決しない場合は、お知らせください。もう一度確認します。

于 2013-01-02T02:29:03.647 に答える
0

追加する必要があると思います

:via => [:post]

あなたのルート仕様に。本番環境ではなく開発環境で機能するのは奇妙に思えますが、Railsルーティングを理解しているので、追加したマッチャーはgetに応答するだけです。

マッチをに変更してみてください

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

また、Andrewから提出されたばかりの回答に基づいて、コレクションではなく特定のIDを持つ特定のプログラムで操作が行われているという事実を明示するために、メンバー指定子を使用する方がよいでしょう。また、URLからidパラメーターを取得するためにおそらく一生懸命働いているadd_fileメソッドにいくつかのコードを保存する必要があります。

于 2013-01-02T02:35:04.633 に答える