web-dev-qa-db-ja.com

ruby javascriptブロック内[スリムテンプレート]

JavaScriptブロック内にRuby条件を置く方法はありますか?.

javascript:
  var config = {
      common_value_1 : 1, 
      common_value_2 : 2 
  };
  - if my_value === true # this must be a Ruby condition
    config.custom_true_value_1 = "1" ;
    config.custom_true_value_2 = "#{my_value}" ;
  - else
    config.custom_false_value_1 = "1" ;
    config.custom_false_value_2 = "#{my_value}" ;

または、この問題に別の回避策がありますか?私が使うことができるcanい方法のために:

javascript:
    var config = {
      common_value_1 : 1, 
      common_value_2 : 2 
    };
- if my_value === true # this must be a Ruby condition
  javascript:
    config.custom_true_value_1 = "1" ;
    config.custom_true_value_2 = "#{my_value}" ;
- else
  javascript:
    config.custom_false_value_1 = "1" ;
    config.custom_false_value_2 = "#{my_value}" ;

しかし、もしconfigがifとelseの間に共通の値を持っていると、コードを複製してしまい、ずっと大きくなり、保守が難しくなるので、私はそれが好きではありません。

より良い例で更新

32
norman784

文字列補間に似たスタイルを使用できます。以下の例を参照してください。

javascript:
  var config = { 
    custom: "#{my_value ? 'truthy' : 'falsy'}",
    current_user: #{raw current_user.to_json}
  };

**以下を更新**

より高度な設定が必要な場合は、たとえばクラスを作成することをお勧めします

class ClientConfig
  attr_accessor :foo, :bar

  # .. code

  def to_json
    { foo: foo, bar: bar }.to_json
  end
end

# in view file
javascript: 
  var config = ClientConfig.new.to_json

それ以外の場合は、Ruby partialを作成する機会もあります。以下の例を作成しました。

# template_path/_config.html.Ruby
def configuration
  { foo: "Hello", bar: "World" }
end

def july_special
  { june_key: "It's June" }
end

def month_name
  Date.today.strftime("%B")
end

config = month_name == 'July' ? configuration.merge(july_special) : configuration

content_tag :script, config.to_json.html_safe

# viewfile
= render 'template_path/config'

私のポイントは、これを行うには複数の方法があり、あなたとあなたのアプリケーションに最も適した方法を見つけようとすることです。私の場合、1つまたは2つの値が必要な場合は、更新前の最初の例を使用します。それ以外の場合は、クラスClientConfigを使用します。

32
aross

純粋なスリムでは、rawhtml_safeもありません。これらの場合、文書化されているように二重中括弧を使用してください here

javascript:
  var data = #{{ JSON.dump([{x: 1, y:2}]) }};
20
fphilipe

次の2つのオプションがあります。

1. Rubyセクションを使用します

このシナリオは、複雑なコードに適しています。

JSONを作成したいRubyオブジェクトがあります。そのため、スリムファイル内にRubyセクションを作成します。

Ruby:

  myObject = @object.to_json.html_safe

注意を払う html_safe:二重引用符をエスケープしないことが重要です。

次に、myObjectセクション内でjavascriptを使用できます。

javascript:

  var data = #{myObject};

2.二重中括弧を使用する

単純な場合は、@ fphilipeの回答にあるように、javascriptセクション内で二重中括弧を使用します。

javascript:

  var data = #{{@object.to_json}};
9