如何在 Ruby on Rails 的视图中显示 HTML?

问题描述 投票:0回答:1

我有一个模块,应该根据用户角色呈现菜单。 我们曾经使用

cancancan
gem,但自从我们有了新规范以来,它已被弃用。

我有一个这样的协会。与

User
Role
存在多对多关系,与
Role
Menu
存在多对多关系,因此
User
Menu
具有嵌套的多对多关系。

我想做的是根据用户角色呈现一个菜单。所以我有这个辅助模块:

module MenuHelper
      # ! MENU MAPPING ===============================
      MENU_NAMES = {
        orders: '<%= main_menu_tree Spree.t(:orders), icon: "shopping-cart", sub_menu: "orders", url: "#sidebar-orders" %>',
        workflows: '<%= tab *Spree::BackendConfiguration::WORKFLOW_TABS, label: Spree.t(:workflows),  icon: "flash" %>',
      }
      # ! MENU MAPPING ===============================

      # this will return menu names
      # @params {ARRAY} menu_names are the allowed menu that the user can access by its role
      # @returns {ARRAY}
      def user_menus(menu_names = [])
        samp_arr = []
        menu_names.each do |m_n|
          samp_arr << MENU_NAMES[:"#{m_n.downcase}"]
        end
        samp_arr
      end
    end

我的

shared/_menu.html.erb
上有这个。

<%  spree_current_user.menus.pluck(:name).each do |n|%>
  <ul>
    <%= n%>
  </ul>
<% end %>

在视图上,它会变成字符串。我预料到了这种行为,但是有没有办法将其评估为一种方法?因为

main_menu_tree
tab
只是一种方法,或者也许有更好的方法来解决这个问题?

ruby-on-rails erb
1个回答
1
投票

当您有

menu_names
时,您可以为每个菜单创建一个新模板(我们将其命名为部分模板),请参阅示例:

app/
  views/
    menus/
      _menu_name_1.html.erb
      _menu_name_2.html.erb

如果您创建这些部分,您应该能够执行以下操作:

<%  spree_current_user.menus.pluck(:name).each do |menu_name| %>
  <ul>
    <%= render "menus/#{menu_name}" %>
  </ul>
<% end %>

它将把菜单名称与要渲染的文件路径连接起来,一切都应该正常工作!

© www.soinside.com 2019 - 2024. All rights reserved.