【问题标题】:Rails view helpers in helper fileRails 在帮助文件中查看帮助程序
【发布时间】:2023-03-12 23:16:01
【问题描述】:

我可能在这里遗漏了一些明显的东西,但这就是我想要做的。

从视图上看,我正在调用自定义辅助函数

<div>
  <%=display_services%>
</div>

在具有 display_services 功能的帮助文件中

def display_services
  html = "<div>"
  form_for @user do |f|
   f.text_field ...
  end
 html << "</div>"
end

我发现 form_for 方法和 f.text_field 直接输出到 HTML 流,没有我喜欢的 div 包装器。在 display_services 中输出所有 HTML 的正确语法是什么?提前感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    恕我直言,您不应该在 Ruby 代码中硬编码 HTML。相反,更喜欢partials views

    module ServicesHelper
      def display_services(user)
        render :partial => "shared/display_services", :locals => {:user => user}
      end
    end
    

    【讨论】:

    • 我同意这种方法 - 在您的帮助程序中构建尽可能少的 html 似乎更简洁。
    • 虽然我对这个答案投了赞成票,并且我完全同意应该在你的帮助程序中生成尽可能少的 HTML(我敢说'任何 HTML 都不应该在帮助程序中生成! '),我想知道这种额外的间接级别对一行代码的好处。当然,这只会增加日后或其他开发人员理解和导航代码库的时间。 (虽然我当然可以看到,如果经常使用它会在短期内节省击键。)
    【解决方案2】:

    只是对风格的建议,我喜欢这样做:

    在你看来:

    <% display_services %>
    

    请注意,不再需要=。 然后,助手使用concat() 将某些内容附加到您的页面,而将长字符串放在一起的东西也已过时:

    def display_services
      concat("<div>")
      form_for @user do |f|
        f.text_field ...
      end
      concat("</div>")
    end
    

    &lt;div&gt; 标签放入助手中是否必要。如果您需要帮助器将某些内容嵌入到块中,您也可以使用一些 yield-magic:

    def block_helper
      concat("<div>")
      yield
      concat("</div>")
    end
    

    并在您的视图中像这样使用它 - 当然也可以使用助手:

    <% block_helper do %>
      cool block<br/>
      <% display_services %>
    <% end %>
    

    【讨论】:

    • 另外一个注意事项,如果你想让你的 HTML 看起来很漂亮,并且 "\n" 到 concat 的末尾。
    【解决方案3】:

    事实证明,我不得不做这样的事情

    def display_services
      html = "<div>"
      html << (form_for @user do |f|
       f.text_field ...
      end)
      html << "</div>"
    end
    

    注意包裹在表单块周围的 ()。如果有人有更好的解决方案,请告诉我。

    【讨论】: