Ruby on rails Rails:如何从字符串中检查CSS或JS代码?

Ruby on rails Rails:如何从字符串中检查CSS或JS代码?,ruby-on-rails,sass,coffeescript,Ruby On Rails,Sass,Coffeescript,在code字符串中,我存储了一段代码,可以是CSS、SASS、SCSS、JavaScript或CoffeeScript。 内容来自用户,我需要在保存到数据库之前验证语法 我需要检查语法是否正确。目前,我正在使用一个丑陋的黑客,工作。你有更好的解决办法吗 def check_js if language == 'coffee' # CoffeeScript CoffeeScript.compile code else # J

code
字符串中,我存储了一段代码,可以是CSS、SASS、SCSS、JavaScript或CoffeeScript。 内容来自用户,我需要在保存到数据库之前验证语法

我需要检查语法是否正确。目前,我正在使用一个丑陋的黑客,工作。你有更好的解决办法吗

def check_js
  if language == 'coffee'      # CoffeeScript
    CoffeeScript.compile code
  else                         # JavaScript
    Uglifier.compile code
  end
rescue ExecJS::RuntimeError => e
  errors.add :code, e.message
end

def check_css
  if language == 'css'         # CSS
    Sass::CSS.new(code).render
  else                         # SASS, SCSS
    Sass.compile code, syntax: language.to_sym
  end
rescue Sass::SyntaxError => e
  errors.add :code, e.message
end
#app/models/user.rb
类用户e
错误。添加:代码,e.message
rescue ExecJS::RuntimeError=>e
错误。添加:代码,e.message
结束
结束
也许是这样的?你怎么想?

使用Sass::CSS.new给了我一个未初始化的常量Sass::CSS错误,即使我已经安装了Sass和Sass rails gems。所以我发现了一块不同的宝石


我认为,为了找到更好的解决方案,查看您在何处调用此功能以及为什么需要此功能的解释将非常有用。@Caffeinated.tech感谢您的建议,我添加了这句话,希望它更清晰:“内容来自用户,我需要在保存到satabase之前验证语法。”@dan klasson我想你是最棒的answer@Benj忘了给你投票了。如果我处在你的位置,我也会这么做的。如果我能改进你的代码,我会发布一个真实的答案。
# app/models/user.rb

class User < ActiveRecord::Base
  validates_with Validators::SyntaxValidator
end

# app/models/validators/syntax_validator.rb

class Validators::SyntaxValidator < ActiveModel::Validator
  def validate(record)
    @record = record

    case language
      when :coffee
        CoffeeScript.compile(code)
      when :javascript
        Uglifier.compile(code)
      when :css
        Sass::CSS.new(code).render
      when :sass
        Sass.compile code, syntax: language.to_sym
      when :scss
        Sass.compile code, syntax: language.to_sym
    end

    rescue Sass::SyntaxError => e
      errors.add :code, e.message

    rescue ExecJS::RuntimeError => e
      errors.add :code, e.message
  end
end
include W3CValidators
validator = CSSValidator.new

results = validator.validate_text(css_code)

if results.errors.length > 0
  @success = false
  results.errors.each do |err|
    puts err.to_s
  end
else
  @success = true
end