我一直在研究的"推荐"的方式来使用Rails视图助手(例如link_to
,content_tag
)在一个普通的Ruby类,如主持人.看来这方面的信息很少,我想知道Stack社区的想法.
所以,我们有的选项是..(注意我使用的是Rails 4,并且不太关心旧版本)
手动包含所需的模块
这可能是最干净的方式,因为只包括所需的助手.但是我发现这种方法在某些情况下不起作用,因为普通Rails助手中提供的通常视图上下文是为当前请求配置的.url_for
例如,我不知道当前的请求,因此主机可能不匹配.
class MyPresenter
include ActionView::Helpers::UrlHelper
include ActionView::Helpers::CaptureHelper
def wrapped_link
content_tag :div, link_to('My link', root_url)
end
end
Run Code Online (Sandbox Code Playgroud)
使用 ActionController::Base.helpers
从Rails 3开始,ActionController::Base
已经包含了helpers
一种访问当前视图上下文的方法.我相信这个方法提供的视图上下文被配置为在rails帮助器中,但我可能是错的.目前还没有任何关于此的文档似乎令人担忧,但它在实践中确实很有效.
class MyPresenter
def wrapped_link
h.content_tag :div, h.link_to('My link', h.root_url)
end
protected
def h
ActionController::Base.helpers
end
end
Run Code Online (Sandbox Code Playgroud)
我相信这个视图上下文也可以混合使用include
,但是rails视图帮助器有数百种方法,并且将它们全部不加选择地包含起来感觉很脏.
调用演示者时注入视图上下文
最后,我们可以在初始化时(或者在render
方法中)将视图上下文传递给类
class MyPresenter
attr_accessor :context
alias_method :h, :context
def initialize(context)
@context = context
end
def wrapped_link
h.content_tag :div, h.link_to('My link', h.root_url)
end
end
class …
Run Code Online (Sandbox Code Playgroud) 试图在Debian/Ubuntu上安装ruby-odbc gem会导致以下错误;
"ERROR: sql.h not found"