2

xmlを一時ファイルに保存してから、別のコントローラーの別のメソッドに送信して処理できるようにしたいと考えています。現在、プライベートメソッドであるため、一度送信されたファイルを読み取ることはできません。

コントローラー#1

xml_doc  = Nokogiri::XML(@builder.to_xml)
@tempfile = Tempfile.new('xml')
@tempfile.write(xml_doc)
redirect_to upload_xml_admin_events_path(:file => @tempfile)

コントローラー#2

バージョン#1

xml = params[:file].read
xmldoc = Nokogiri::XML(xml)

このエラーが発生します: "File:0x6ebfb00":Stringの未定義のメソッド `read'

バージョン#2

xml = params[:file]
xml.open
xmldoc = Nokogiri::XML(xml)

このエラーが発生します:プライベートメソッド `open'が"#File:0x6a12bd8 ":Stringに対して呼び出されました

4

1 に答える 1

0

paramsはオブジェクトである可能性があると考えているようですが、Railsの魔法によって許される可能性があります。実際には、すべてのパラメーターは、key=value形式のキーを持つ文字列です。

したがって、ここでの問題は、パラメータ'file'を使用してリダイレクトすると、Tempfileオブジェクトが文字列に変換されることです。これが、文字列に対してreadまたはopenと呼ばれるアクセス可能なメソッドがないことをエラーが示している理由です。いくつかのオプションがあります。

  1. コントローラ2にリダイレクトする代わりに、コントローラ1のファイルで行うことは何でもします。余分なオブジェクトを作成したり、データベースにアクセスしたり、URLにクレイジーなパラメータを設定したりする必要はありません。

  2. XMLが非常に大きくなる可能性がある場合は、XmlFileなどと呼ばれるARオブジェクトを作成し、それをController 1のデータベースに書き込んでから、パラメーターにそのIDを使用してリダイレクトする方がよい場合があります。このように、URLでクレイジーな長いXML文字列を送信する必要はありません(これは悪いことです):

    # Controller 1
    @xml = XmlFile.new(@builder.to_xml)
    redirect_to upload_xml_admin_events_path(:xml => @xml) #implicitly @xml.to_s
    
    # Controller 2
    @xml = XmlFile.find(params[:xml])
    Nokogiri::XML(@xml)
    
  3. XMLが常に(非常に)小さい場合は、XMLをプレーンテキストのパラメーターとして送信できます(これは現在行っていることに最も近いようですが、あまりエレガントではありません)ここでURLエンコードの問題が発生する可能性があります。

    # Controller 1
    xml = @builder.to_xml
    redirect_to upload_xml_admin_events_path(:xml => xml)
    
    # Controller 2
    @xml = Nokogiri::XML(params[:xml])
    
于 2013-01-23T22:28:16.640 に答える