Можно ли вызвать метод, который использует "content_tag" из контроллера в Rails 3?

В моем приложении Rails 3 я использую Ajax для получения форматированного HTML:

$.get("/my/load_page?page=5", function(data) {
  alert(data);
});

class MyController < ApplicationController
  def load_page
    render :js => get_page(params[:page].to_i)
  end
end

get_page использует метод content_tag и должен быть доступен также в app/views/my/index.html.erb.

Так как get_page использует много других методов, я инкапсулировал все функциональные возможности в:

# lib/page_renderer.rb
module PageRenderer
  ...
  def get_page
    ...
  end
  ...
end

и включил его так:

# config/environment.rb
require 'page_renderer'

# app/controllers/my_controller.rb
class MyController < ApplicationController
  include PageRenderer
  helper_method :get_page
end

Но, поскольку метод content_tag недоступен в app/controllers/my_controller.rb, я получил следующую ошибку:

undefined method `content_tag' for #<LoungeController:0x21486f0>

Итак, я попытался добавить:

module PageRenderer
  include ActionView::Helpers::TagHelper    
  ...
end

но потом я получил:

undefined method `output_buffer=' for #<LoungeController:0x21bded0>

Что я делаю неправильно?

Как бы вы решили это?

Ответ 1

Помощники действительно представляют собой код просмотра и не должны использоваться в контроллерах, что объясняет, почему так сложно это сделать.

Другим способом (IMHO, лучше) для этого было бы создать представление или частичное с HTML, которое вы хотите обернуть вокруг параметров [: page].to_i. Затем в вашем контроллере вы можете использовать render_to_string для заполнения: js в основном рендере в конце метода load_page. Тогда вы можете избавиться от всего этого, и это будет немного чище.

Кстати, helper_method делает противоположное тому, что вы пытаетесь сделать - это делает метод контроллера доступным в представлениях.

Ответ 2

Чтобы ответить на предлагаемый вопрос, ActionView:: Context определяет метод output_buffer, для устранения ошибки просто включите соответствующий модуль:

module PageRenderer
 include ActionView::Helpers::TagHelper
 include ActionView::Context    
 ...
end