【问题标题】:Print css (with variables) to a file将 css(带变量)打印到文件中
【发布时间】:2018-10-18 15:54:15
【问题描述】:

我有一个生成 epub 的服务,因此我需要生成一个 css 文件以嵌入到 epub 中。

我在epub/style.css.erb 下创建了一个css 视图,但是由于逻辑在服务中而不是在控制器中,因此似乎无法调用render_to_string。实际上,该服务被包装在一个sidekiq作业中,也可以从模型中的after_update调用,所以这对render_to_string有进一步的阻碍。

我可以像EpubController 一样创建并从那里调用render_to_string 方法。但是从我的服务中,位于app/services/epub_export.rb 下,我如何将参数发送到控制器/从控制器接收输出?这样一来,我就觉得我会打破 MVC 模式。

但我也不喜欢古典的方式,例如

File.open(@css_path, 'w') do |f|
  f.puts "@charset utf-8;"
  f.puts "/* Styles for GEPUB Sample Book */"
  f.puts "h1"
  f.puts "{"
  f.puts "  text-align: center;"
  f.puts "  color: #0000ff;"
  f.puts "  font-weight: normal;"
  f.puts "  font-family: #{@font_family};"
  f.puts "}"
end

或者有什么替代方法吗?

【问题讨论】:

  • 什么意思,“既然逻辑在服务里,不在控制器里,好像没办法调用render_to_string”?
  • 我在app/services/epub_export.rb 下有一个服务可以做到这一点,所以我不能打电话给render_to_string
  • 已编辑问题

标签: css ruby-on-rails file service render


【解决方案1】:

我在控制器外部的异步作业中一直使用render_to_string 来生成pdf。看起来像:

class FooService

  ...

  def pdf
    ActionController::Base.new.render_to_string(
      pdf:        "pdf_name", 
      template:   'path/to/template',
      locals:     {presenter: self},
      page_size:  'Letter',
      encoding:   "UTF-8",
      margin: {
        top: 20,
        bottom: 20
      }
    )
  end

  ...

end

您是否尝试过类似的方法?

【讨论】:

  • 谢谢,它有效 :) 我现在将使用这个解决方案。希望在服务中调用ActionController 不会那么有害...... :)
  • 这(大致)是 DHH 的做法,所以你应该没问题。您可能想查看this thread。顺便说一句,您使用的是哪个版本的导轨?像这样的东西现在已经内置到 5 中(我还没有使用)。
  • 我的 Rails 版本是 5.0.7
  • 就像我说的,我还没到 5。但是,您可以看看this articlesource code
猜你喜欢
  • 1970-01-01
  • 2021-03-19
  • 2018-10-12
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 2019-12-25
相关资源
最近更新 更多