15

私の Rails 3 アプリケーションでは、フォーマットされた HTML を取得するために Ajax を使用しています。

$.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_pagecontent_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

ヘルパーは実際にはコードを表示するものであり、コントローラーで使用することは想定されていません。これが、実現が非常に難しい理由を説明しています。

これを行う別の (IMHO、より良い) 方法は、params[:page].to_i をラップしたい HTML でビューまたはパーシャルを構築することです。次に、コントローラーで render_to_string を使用して、load_page メソッドの最後でメイン レンダーに :js を設定できます。次に、他のすべてのものを取り除くことができ、かなりきれいになります。

ちなみに、 helper_method はあなたがやろうとしていることとは逆のことをします - ビューでコントローラーメソッドを利用できるようにします。

于 2011-06-06T23:34:44.753 に答える
0

これら 2 つの含まれているモジュールからすべての不要な部分を含めたくない場合は、別のオプションとして、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 に答える