14

"<html><body>Hello World</body></html>"ファックス送信用に html の文字列 ( のようなもの) が必要です。

私はそれを別のerbファイルに書きました:views/orders/_fax.html.erb、動作中のerbをレンダリングしようとしました:html_data = render(:partial => 'fax')

問題を引き起こすコントローラーの一部を次に示します。

  respond_to do |format|
      if @order.save   
        html_data = render(:partial => 'fax')
        response = fax_machine.send_fax(html_data)
        ......

        format.html { redirect_to @order, notice: 'Order was successfully created.' }
        format.json { render json: @order, status: :created, location: @order }
      else  
        format.html { render action: "new" }
        format.json { render json: @order.errors, status: :unprocessable_entity }
      end
    end

以下のように AbstractController::DoubleRenderError が返されました。

AbstractController::DoubleRenderError in OrdersController#create

Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".

この問題を解決するには?

4

4 に答える 4

18

レンダリングされた HTML のみが必要で、コントローラーからの機能が必要ない場合は、ヘルパー クラス内で直接 ERB を使用してみてください。

module FaxHelper

  def to_fax
    html = File.open(path_to_template).read
    template = ERB.new(html)
    template.result
  end

end

ERBのドキュメントでは、これについて詳しく説明しています。

編集

コントローラーからインスタンス変数を取得するには、バインディングをresult呼び出しに渡します。

# controller
to_fax(binding)

# helper class
def to_fax(controller_binding)
  html = File.open(path_to_template).read
  template = ERB.new(html)
  template.result(controller_binding)
end

注:私はこれをやったことがありませんが、うまくいくようです:)

于 2013-01-16T03:58:28.453 に答える
0

その理由は、同じアクション内で一度に複数回レンダリングまたはリダイレクトできないためです。

しかし、コードには と の両方がrenderありredirectます。コントローラーでは、json出力が必要ないと仮定して、単純にレンダリングのみを使用できると思います。

これを試して

def create
  @order.save   
  render(:partial => 'fax')
end

私はこれをテストしていませんが、あなたはアイデアを理解していると思います:)、エラーを処理する方法についても考えてください(注文が保存されなかった場合)。

于 2013-01-16T03:57:44.490 に答える
0

HTML をエスケープしたくない場合は、.html_safe を呼び出すだけです。

"<html><body>Hello World</body></html>".html_safe

あなたのエラーについては、OrdersController を投稿してください - create アクションで render または redirect を複数回呼び出しているようです。

(ちなみに、試している場合に備えて-コントローラーでパーシャルをレンダリングすることはできません-ビューでのみパーシャルをレンダリングできます)

編集:ええ、あなたの問題は、コントローラーアクションでパーシャルをレンダリングしようとしていることです。コールバックを使用しafter_createて Fax をセットアップして送信することもできますが、(ビュー用であるため) パーシャルを使用する必要はありません。http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

編集:ファックスの問題については、通常のRubyクラスを作成できます。Yehudaからのこの優れたアドバイスを参照してください:https ://stackoverflow.com/a/1071510/468009

于 2013-01-16T03:09:54.463 に答える