tom*_*non 25 ruby-on-rails ruby-on-rails-4
我一直在研究的"推荐"的方式来使用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 MyController < ApplicationController
def show
# WARNING - `view_context` in a controller creates an object
@presenter = MyPresenter.new(view_context)
end
end
Run Code Online (Sandbox Code Playgroud)
我个人倾向于倾向于后两种选择,但是Rails团队没有明确的答案(我能够找到),我觉得有点不确定.谁比Stack更好问!
小智 6
我会选择第二个和第三个选项,例如:
class MyPresenter
def initialize(helpers)
@h = helpers
end
def wrapped_link
h.content_tag :div, h.link_to('My link', h.root_url)
end
private
attr_reader :h
end
Run Code Online (Sandbox Code Playgroud)
你的第二个选项要求你所有的单元测试都是存根的,因为ActionController::Base.helpers
这可能不是一个好的选择,而你的第三个选择就是使用一个巨大的上下文来访问一些方法.
归档时间: |
|
查看次数: |
3933 次 |
最近记录: |