【问题标题】:Set layout from responder?从响应者设置布局?
【发布时间】:2010-11-21 04:21:07
【问题描述】:

我试图弄清楚如何从定制的响应器中设置布局。我想使用request.xhr?将渲染的布局设置为“ajax”。有人知道该怎么做吗? 我正在使用 Rails 3,我有一个这样的响应器:

module AjaxLayoutResponder
  def to_html
    if request.xhr?
      # do something here to change layout...
    end
    super
  end
end

在我看来,响应者是完成这种“ajax”布局切换的最佳方式。

【问题讨论】:

    标签: ruby-on-rails ruby layout ruby-on-rails-3 responders


    【解决方案1】:

    我不同意响应者是要走的路。这是我在大多数项目中使用的简单解决方案(但我只是将 ajax 布局设置为 nil):

    在 application_controller.rb 中

    layout :set_layout
    
    def set_layout
      request.xhr? 'ajax' : 'application'
    end
    

    【讨论】:

    • 这通常是我所做的,但这个特定的项目使用为不同控制器定制的布局。这将始终使我的布局成为“应用程序”而不是自定义布局。在我看来,根据请求是否为 ajax 来更改布局实际上确实符合响应者的描述。控制器为什么要关心?响应者根据请求类型自定义响应。这将促进干代码重用。而不必为每个具有非标准布局的控制器制作自定义“set_layout”。
    • 啊,我明白了。您的布局是否以您的控制器命名?如果是这样,这样的事情可能会起作用:request.xhr? 'ajax' : params[:controller].singularize
    • 这似乎合乎逻辑。我得试试看。谢谢:)
    【解决方案2】:

    你可以这样做:

    module AjaxLayoutResponder
      def to_html
        if request.xhr?
          options[:layout] = 'ajax'
        end
        super
      end
    end
    

    因为在响应者执行结束时调用的是:

    # from https://github.com/plataformatec/responders/blob/master/lib/action_controller/responder.rb
    def default_render
      if @default_response
        @default_response.call(options)
      else
        controller.render(options)
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2017-01-11
      • 2019-08-03
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多