15

在我的 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>

我究竟做错了什么 ?

你会如何解决这个问题?

4

3 回答 3

35

为了回答提出的问题,ActionView::Context定义了 output_buffer 方法,解决错误只需包含相关模块:

module PageRenderer
 include ActionView::Helpers::TagHelper
 include ActionView::Context    
 ...
end
于 2012-12-05T21:08:32.400 回答
2

助手是真正的视图代码,不应该在控制器中使用,这就解释了为什么很难做到这一点。

另一种(恕我直言,更好的)方法是使用您希望包裹在 params[:page].to_i 周围的 HTML 构建视图或部分视图。然后,在您的控制器中,您可以使用 render_to_string 在 load_page 方法末尾的主渲染中填充 :js。然后你可以摆脱所有其他的东西,它会更干净一些。

顺便说一句, helper_method 与您尝试做的相反 - 它使控制器方法在视图中可用。

于 2011-06-06T23:34:44.753 回答
0

如果您不想包含这两个包含模块中的所有内容,另一种选择是调用content_tagvia ActionController::Base.helpers。这是我最近用来实现此目的的一些代码,也利用safe_join

helpers = ActionController::Base.helpers
code_reactions = user_code_reactions.group_by(&:code_reaction).inject([]) do |arr, (code_reaction, code_reactions_array)|
  arr << helpers.content_tag(:div, nil, class: "code_reaction_container") do
    helpers.safe_join([
      helpers.content_tag(:i, nil, class: "#{ code_reaction.fa_style } fa-#{ code_reaction.fa_icon }"),
      helpers.content_tag(:div, "Hello", class: "default_reaction_description"),
    ])
  end
end
于 2020-12-31T20:37:17.620 回答