【问题标题】:Extracting Rails helpers methods to a separate class将 Rails 辅助方法提取到单独的类
【发布时间】:2018-07-09 16:09:11
【问题描述】:

我想开始为 Rails 视图助手创建对象,而不是使用助手(某种“滚动你自己的”Cell::Object of Trailblazer 或 Hanami 视图)。在我们开始混合块之前,一切都按预期工作,奇怪的是,我们在 erb 和 haml 模板上得到了不同的结果!

这是一个普通的 Rails v5.2 应用程序,仅添加了 haml-rails,以简化问题:

<h1>ERB</h1>

<%= bordered do %>
  <p>This works</p>
<% end %>

<hr />

<%= Builder.new.bordered do %>
  <p>This not works</p>
<% end %>

app/views/home/erb.html.erb

%h1 HAML

= bordered do
  %p This works

%hr

= Builder.new.bordered do
  %p This not works

app/views/home/haml.html.haml

module HomeHelper
  def bordered(&block)
    content_tag(:div, style: 'border: 1px solid black') do
      block.call
    end
  end
end

app/helpers/home_helper.rb

class Builder
  include ActionView::Helpers
  include ActionView::Context

  def bordered(&block)
    content_tag(:div, style: 'border: 1px solid black') do
      block.call
    end
  end
end

app/presenters/builder.rb




如您所见,当使用帮助程序类时,输出会出错,但奇怪的是,根据我们使用的模板引擎会有所不同。有人可以指出正确的方向以了解正在发生的事情以及我们如何做想?谢谢

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-5


【解决方案1】:

Rails 助手在视图本身上执行,这意味着如果您要传递视图,您可以在相同的上下文中调用它的方法:

以下是您的问题的解决方案:

class Builder

  def initialize(view_context)
    @view_context = view_context
  end

  def bordered(&block)
    @view_context.content_tag(:div, style: 'border: 1px solid black', &block)
  end

end

现在,如果您想使用构建器,您将在创建时传递视图,例如。 Builder.new(self).bordered 在视图本身中。

您也可以使用 Rails TagBuilder (doc),但您仍然需要视图上下文:

class Builder

  def initialize(view_context)
    @view_context = view_context
  end

  def bordered(&block)
    tag_builder.div(style: 'border: 1px solid black', &block)
  end

  private

  def tag_builder
    @tag_builder ||= ::ActionView::Helpers::TagHelper::TagBuilder.new(@view_context)
  end

end

【讨论】:

  • 感谢您的宝贵时间,我正试图避免传递 view_context 的必要性,正是为了创建一个封装的 Rails 演示者......但看起来这是不可能的!啊
猜你喜欢
  • 1970-01-01
  • 2012-12-30
  • 2016-07-22
  • 1970-01-01
  • 2014-02-10
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多