小编tom*_*non的帖子

建议在表示类中使用Rails视图助手的方法

我一直在研究的"推荐"的方式来使用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)

ruby-on-rails ruby-on-rails-4

25
推荐指数
1
解决办法
3933
查看次数

在Ubuntu上安装ruby-odbc gem时出现"ERROR:sql.h not found"

试图在Debian/Ubuntu上安装ruby-odbc gem会导致以下错误;

"ERROR: sql.h not found"

ruby gem

20
推荐指数
3
解决办法
7704
查看次数

标签 统计

gem ×1

ruby ×1

ruby-on-rails ×1

ruby-on-rails-4 ×1