Rails 4.2:引擎中SCSS清单的自定义帮助程序

时间:2015-10-13 22:00:34

标签: ruby-on-rails ruby ruby-on-rails-4 sprockets ruby-on-rails-4.2

我们的应用程序是3个引擎的集合,构成了我们的基础宝石。其他插件gem,专门为我们的基础gem编写,可用于向基础添加功能。

目前,我们有2个自定义sprockets指令和1个自定义Sass导入程序,它们尝试将这些插件中的SCSS文件动态引入基本清单。一个人为的例子看起来像:

//= depend_on_gemfile     # mimics default "depend_on" functionality
//= depend_on_stylesheets # mimics default "depend_on" functionality

...

@import 'engine/namespace/settings/global';
@import 'engine/namespace/settings/colors';
@import 'engine/namespace/settings/fonts';
@import '[engine-plugins]/namespace/settings'; # mimics Sass Filesystem importer

...

要清楚,这是有效的。我们在使用Sass缓存文件的方式时遇到了问题,这有点过于复杂而无法实现我的目标。

关键是我们意识到删除自定义Sprockets指令和Sass导入器,支持使用Rails帮助程序,也可以解决我们的问题,因为ERB将在SCSS之前编译,我们能够找到并将所有包含的插件中所需的所有路径格式化为字符串并将其转储到清单中。类似的东西:

@import 'engine/namespace/settings/global';
@import 'engine/namespace/settings/colors';
@import 'engine/namespace/settings/fonts';
<%= load_plugin_stylesheets_for('settings'); %>

...

这似乎是一个更简单的解决方案,因为我们所做的就是找到每条路径并将这些路径转换为字符串。

问题似乎是Rails助手完全在Sprockets的域之外。

我找到了一些资源,但它们似乎都与Rails 3有关。

我很好奇是否有人遇到过Rails 4的这个问题,如果他们解决了这个问题以及如何解决它。或者,如果我只是考虑这一切都是错误的,并且有一种更好的方法来解决问题而没有像以前那样类似的过度复杂化。

TL; DR

我想在Sprockets清单文件中使用常规的Rails助手。 Rails版本是4.2.4。我们正在运行引擎。这可能吗?

修改

This comment回答了我的问题。

在我们的engine.rb文件中的初始化程序中实现此解决方案后,所有Rails ActionView助手都可用,包括我的自定义书面助手。

1 个答案:

答案 0 :(得分:0)

我们前一段时间遇到过类似问题。

application.scss(在gem中)看起来像这样:

def server(port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('127.0.0.1', port))
    sock.listen(5)
    clientsocket, address = sock.accept()

    kkp = KnockKnockProtocol(); #Class which implements knock knock
    outputLine = kkp.processInput();
    clientsocket.sendto(outputLine, address)

    inputLine, address = clientsocket.recvfrom(MAX_BYTES)

    while inputLine:
        print inputLine, address
        outputLine = kkp.processInput(inputLine);
        clientsocket.sendto(outputLine, address)
        if outputLine == "Bye.":
            break
        inputLine, address = clientsocket.recvfrom(MAX_BYTES)


def client(port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(("127.0.0.1", port))
    fromServer, address = sock.recvfrom(MAX_BYTES)

    while fromServer:
        print "Server: " + fromServer
        if fromServer == "Bye.":
            break

        fromUser = raw_input()
        if fromUser:
            print "Client: " + fromUser
            sock.sendto(fromUser, ("127.0.0.1", port))
        fromServer, address = sock.recvfrom(MAX_BYTES)


if __name__ == '__main__':
    choices = {'client': client, 'server': server} 
    parser = argparse.ArgumentParser(description='Send and receive UDP locally')
    parser.add_argument('role', choices=choices, help='which role to play')
    parser.add_argument('-p', metavar='PORT', type=int, default=1060, help='UDP port (default 1060)')
    args = parser.parse_args()
    function = choices[args.role]
    function(args.p)

和gemspec包含用于包含app文件夹中所有代码的行。

 /*
 *= require_tree .
 *= require_self
 */

@import "c3.min";
@import "analytics";

请务必检查您是否在env文件中未启用任何缓存。