34

ruby 条件を javascript ブロック内に入れる方法はありますか? すなわち

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}" ;

または、この問題の別の回避策はありますか? 私が使用できる醜い方法は次のとおりです。

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 の間に共通の値を持っていると、コードが複製されて、はるかに大きくなり、保守が困難になるため、私はそれが好きではありません。

より良い例で更新

4

3 に答える 3

35

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

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

それ以外の場合は、ルビーのパーシャルを作成する機会もあります。以下に例を作成しましたが、それほど美しくはないかもしれませんが、私は機能します。

# 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

于 2013-07-22T18:18:51.117 に答える
14

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

1.rubyセクションを使用する

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

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

ruby:

  myObject = @object.to_json.html_safe

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

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

javascript:

  var data = #{myObject};

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

javascript単純なケースでは、@ fphilipe の回答に記載されているように、セクション内で二重中括弧を使用します。

javascript:

  var data = #{{@object.to_json}};
于 2016-12-09T18:15:37.463 に答える