如何在 sinatra 视图中渲染部分内容(haml in haml)?

发布于 2024-09-28 09:29:15 字数 225 浏览 2 评论 0原文

我有一个简单的 sinatra 应用程序,它使用 haml 和 sass 作为视图。其中一个视图(位于视图文件夹中)是我的导航菜单的一部分。我试图从 index.haml 渲染它,但出现以下错误:参数数量错误 (1 for 2)

我尝试使用 index.haml 中的以下行渲染它

.navigation
  = render :partial => "nav"

I have a simple sinatra app that uses haml and sass for the views. One of the views (located in the views folder) is a partial for my navigation menu. I am trying to render it from index.haml but I get the following error: wrong number of arguments (1 for 2)

I am trying to render it with the following lines in index.haml

.navigation
  = render :partial => "nav"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

黯然#的苍凉 2024-10-05 09:29:15

你可以只使用 Sinatra 的 haml 函数:

= haml :nav

You can just use Sinatra's haml function:

= haml :nav
撩心不撩汉 2024-10-05 09:29:15

或者你可以这样做:

helpers do
  def partial(page, options={})
    haml page.to_sym, options.merge!(:layout => false)
  end
end

并将你的部分包含在:

= partial( "something-rad" )

Or you could just do this:

helpers do
  def partial(page, options={})
    haml page.to_sym, options.merge!(:layout => false)
  end
end

And include your partial with:

= partial( "something-rad" )
遗忘曾经 2024-10-05 09:29:15

我是这样做的(比 @kfl62 的答案更简单,比 @jm3 的答案功能更丰富):

module Partials
  def partial( page, variables={} )
    haml page.to_sym, {layout:false}, variables
  end
end
helpers Partials

在 Haml 文件中使用它,例如:

%ul#comments
  - @comments.each do |comment|
    %li= partial :comment, comment:comment

Here's how I do it (more simply than @kfl62's answer, more feature-rich than @jm3's answer):

module Partials
  def partial( page, variables={} )
    haml page.to_sym, {layout:false}, variables
  end
end
helpers Partials

Use it in your Haml file like:

%ul#comments
  - @comments.each do |comment|
    %li= partial :comment, comment:comment
满身野味 2024-10-05 09:29:15

编辑:!!!已过时!!!阅读下面Jason的答案!

您正在尝试什么在 rails 中起作用! Sinatra 没有 partial 方法。 Sinatrapartial 的实现看起来像 这个(来源要点) 来自 github:

module Haml
  module Helpers
    def partial(template, *args)
      template_array = template.to_s.split('/')
      template = template_array[0..-2].join('/') + "/_#{template_array[-1]}"
      options = args.last.is_a?(Hash) ? args.pop : {}
      options.merge!(:layout => false)
      if collection = options.delete(:collection) then
        collection.inject([]) do |buffer, member|
          buffer << haml(:"#{template}", options.merge(:layout =>
          false, :locals => {template_array[-1].to_sym => member}))
        end.join("\n")
      else
        haml(:"#{template}", options)
      end
    end
  end
end

包括此方法,您可以在 .haml 文件中调用 partial,例如
=partial("partial_name")

如果你想在其他视图中渲染一个视图,语法是
= render(:haml,:'rel_path_to_view',:locals => {:optional => option})

注意 railssinatra 之间的语法差异关于render方法!

EDIT: !!! OUTDATED !!! Read Jason's answer below!

What are you trying works in rails! Sinatra has no partial method. An implementation of partial on Sinatra looks like this (source gist) from github:

module Haml
  module Helpers
    def partial(template, *args)
      template_array = template.to_s.split('/')
      template = template_array[0..-2].join('/') + "/_#{template_array[-1]}"
      options = args.last.is_a?(Hash) ? args.pop : {}
      options.merge!(:layout => false)
      if collection = options.delete(:collection) then
        collection.inject([]) do |buffer, member|
          buffer << haml(:"#{template}", options.merge(:layout =>
          false, :locals => {template_array[-1].to_sym => member}))
        end.join("\n")
      else
        haml(:"#{template}", options)
      end
    end
  end
end

Including this method, you may call partial in your .haml files, like
= partial("partial_name")

If you want to render a view in an other view syntax is
= render(:haml,:'rel_path_to_view',:locals => {:optional => option})

Notice the syntax differences between rails and sinatra regarding render method!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文