Подтвердить что ты не робот

Как отобразить шаблон erb в строке внутри действия?

Мне нужна строка html (что-то вроде "<html><body>Hello World</body></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".

Как решить эту проблему?

4b9b3361

Ответ 1

Если вам нужен только обработанный 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

Примечание. Я никогда не делал этого, но он кажется работоспособным:)

Ответ 2

Используйте метод #render_to_string

он работает так же, как и обычный метод визуализации, но полезен, когда вам нужно добавить некоторый шаблонный HTML в ответ json

http://apidock.com/rails/ActionController/Base/render_to_string

Ответ 3

Если вы не хотите скрывать html, просто вызовите на него .html_safe:

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

Повторите свою ошибку, разместите свой OrdersController - похоже, вы вызываете рендеринг или перенаправление более одного раза в действии create.

(Btw, на всякий случай, если вы пытаетесь это сделать - вы не можете отображать частичное в контроллере - вы можете отображать только частичные представления в представлениях)

Изменить: да, ваша проблема заключается в том, что вы пытаетесь сделать частичное действие контроллера. Вы можете использовать обратный вызов after_create для настройки и отправки факса - хотя вы опять не захотите использовать частичный (как и для просмотров). http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

Изменить: для проблемы с факсом вы можете создать обычный класс Ruby, см. этот отличный совет от Yehuda: fooobar.com/questions/28802/...

Ответ 4

причина в том, что вы не можете визуализировать или перенаправлять внутри одного и того же действия более одного раза при заданном время

Но в вашем коде у вас есть как render, так и redirect

Я думаю, что в вашем контроллере вы можете просто использовать только рендер, считая, что вам нужно какой-либо выход json

попробуйте это

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

Я не тестировал это, но, я думаю, вы поняли идею:) и подумайте о способе обработки ошибок (в случае, если заказ не сохранил)

НТН