ruby-on-rails - Rails 助手作为一个类
问题描述
我发现自己正在编写帮助程序以使我的观点非常清晰;然而,助手并不自然地以类的形式出现,而只是模块内的一组方法。因此,这些方法不会像使用参数调用 initialized 那样共享数据。所以我最终会多次传递数据。这很烦人。有没有办法把它放在一个共享价值的类中?
这是我试图干掉的一个例子——是的,它远非最佳代码,请只关注我试图解决的问题;我不想浪费时间做一个完美的例子。在下面,正在传递选项,但我最终将它们传递给其他方法等。
module Dashboard::DashboardHelper
def menu_item(link_ref, options={})
title = options.fetch(:title, "")
details = options.fetch(:details, "")
highlight = options.fetch(:highlight, false)
icon = options.fetch(:icon, "")
first = options.fetch(:first, false)
subs = options.fetch(:subs, [])
link_item_class = (first) ? "m-t-30" : " "
content_tag(:li,
menu_link_label(link_ref,title,details,icon,highlight),
class: link_item_class
)
end
def menu_link_label(link_ref, title, details, icon, highlight)
link_to(menu_labels(title,details), link_ref, class: "detailed") +
icon_thumbnail(icon,highlight)
end
def menu_labels(title, details)
content_tag(:span, title, class: "title") +
content_tag(:span, details, class: "details")
end
def icon_thumbnail(name, family, highlight=true)
classes = (highlight) ? "bg-success icon-thumbnail" : "icon-thumbnail"
content_tag(:span,icon(name, family), class: classes)
end
def icon(name)
(name.present?) ? content_tag(:i, nil, class:"fas fa-#{name}") : ""
end
end
编辑:
选项哈希直接来自视图,通常采用以下形式:
<%= menu_item dashboard_root_path,
title: "Dashboard",
details: "12 New Updates",
icon: "fe:home",
first: true,
highlight: true
%>
解决方案
没有什么能阻止你在 eg 中自己拥有一些课程app/view_helpers
并在你的视图中使用它们
# app/view_helpers/menu.rb
class Menu
attr_accessor :options
def initialize(options={})
# do something with your options
# self.options[:header] = options.fetch(:header, '')
end
def header
# use your options here
content_tag(:h1, options[:header])
end
end
# some_controller.rb
def index
@menu = Menu.new
end
# index.html.erb
<%= @menu.header %>
推荐阅读
- c - 计算C程序的效率
- javascript - 地图大小未在 map.udpateSize() 上更新
- reactjs - 通过 index.js 重新导出 JSS 会导致不相关组件中出现不需要的重新渲染
- node.js - 从 mongodb 查找聚合中获取真或假(仅值不是数组或对象)
- python-3.x - 当我尝试使用 cv2.imshow() 打开图像时,会弹出一个空白图像窗口
- ios - JSON解码不填充表视图
- tfs - 如何配置 Team Foundation Server 2015 以强制所有工作区仅限本地?
- laravel - 在 apache 虚拟主机中部署多个 laravel 项目
- python - 只需要获取没有索引和数据类型Python的模式值
- python - 从 Python 中的不同目录导入