在我的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>
我做错了什么?
你会如何解决这个问题?
答案 0 :(得分:32)
要回答提出的问题, ActionView :: Context 定义了output_buffer方法,解决错误只需包含相关模块:
module PageRenderer
include ActionView::Helpers::TagHelper
include ActionView::Context
...
end
答案 1 :(得分:1)
助手实际上是视图代码,不应该在控制器中使用,这就解释了为什么它很难实现。
另一种(恕我直言,更好)这样做的方法是使用你想要包裹在params [:page] .to_i周围的HTML来构建视图或部分视图。然后,在您的控制器中,您可以使用render_to_string来填充:load_page方法末尾的主渲染中的js。然后你可以摆脱所有其他的东西,它会更加清洁。
顺便说一下,helper_method与你想要做的事情正好相反 - 它使视图中的控制器方法可用。
答案 2 :(得分:0)
如果您不想包含这两个包含的模块中的所有内容,另一种选择是通过 content_tag
调用 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