标记 a 从 erb 到 Haml

Tag a from erb to Haml

我在 haml 中有下一个代码,显示错误:显示 /home/ubuntu/workspace/app/views/layouts/application.html.haml 其中第 24 行出现:非法嵌套:内容不能同时在与 %a 相同的行并嵌套在其中。

第 24 行是 = current_user.name haml代码有什么问题?

!!!
%html
  %head
    %title Chat
    = stylesheet_link_tag
    = javascript_include_tag
    = csrf_meta_tags

  %body
    %div.navbar.navbar-default.navbar-static-top
      .container   
        .navbar-header
          = link_to 'Chat', root_path, class: 'navbar-brand'

      .navbar
        %ul.nav.navbar-nav
          %li
            = link_to 'Home', root_path

        %ul.nav.navbar-nav.pull-right
          - if user_signed_in?
            %li.dropdown
              %a.dropdown-toggle {"data-toggle": "dropdown", href: "#"}
                = current_user.name    
              %ul.dropdown-menu {role: "menu">
                %li
                  = link_to 'Profile', edit_user_registration_path
                %li 
                  = link_to 'Log out', destroy_user_session_path, method: :delete
          - else
            %li
              = link_to 'Log In', new_user_session_path
            %li
              = link_to 'Sign Up', new_user_registration_path


    .container
      = flash.each do |key, value|
        %div.alert.alert-"#{key}"
          = value

      = yield

  %footer  
    %p Copyright © #{Time.now.year}

尝试以下操作:

%a.dropdown-toggle{data-toggle: "dropdown", href: "#"} = current_user.name

或者,您 应该 调用 Rails 的 link_to 助手以使其正常工作:

= link_to current_user.name, "#", data: {toggle: "dropdown"}, class: "dropdown-toggle"

given on the same line as %a and nested within it

该错误基本上意味着 HAML 将 .dropdown-toggle{ 之间的 space 视为 link 标签的 "content"。

当您随后在下面的行中声明 = current_user 时,会混淆在 link

的 "content" 中显示哪一个

关于您的错误,以下是我设置页面格式的方式:

!!!
%html
  %head
    %title Chat
    = stylesheet_link_tag
    = javascript_include_tag
    = csrf_meta_tags

  %body
    .navbar.navbar-default.navbar-static-top
      .container   
        .navbar-header
          = link_to 'Chat', root_path, class: 'navbar-brand'

      .navbar
        %ul.nav.navbar-nav
           %li= link_to 'Home', root_path

        %ul.nav.navbar-nav.pull-right
          - if user_signed_in?
            %li.dropdown
              = link_to current_user.name, "#", data: {toggle: "dropdown"}, class: "dropdown-toggle"
              %ul.dropdown-menu{data-role: "menu"}
                 %li= link_to 'Profile', edit_user_registration_path
                 %li= link_to 'Log out', destroy_user_session_path, method: :delete
          - else
            %li= link_to 'Log In', new_user_session_path
            %li= link_to 'Sign Up', new_user_registration_path


    .container
      = flash.each do |key, value|
        .alert.alert-"#{key}" = value
      = yield

  %footer  
    %p Copyright © #{Time.now.year}

一些建议:

  1. 您不需要声明 %div - 只需使用 .css_class 它会自动创建一个 div

  2. HAML 基本上就像一个巨大的 markdown 脚本 - 它以不同的方式处理代码中的每个细微差别。对于 inlinenested 内容尤其如此。

如果是单行,不需要嵌套内容:

.alert.alert-"#{key}"= value

如果你有多行,你需要保持你的初始代码没有 spaces:

%ul.dropdown-menu{data-role: "menu"}
   = #this can be nested

将第 23 行更改为

%a.dropdown-toggle{"data-toggle": "dropdown", href: "#"}