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の間に共通の値を持っていると、コードを複製してしまい、ずっと大きくなり、保守が難しくなるので、私はそれが好きではありません。
より良い例で更新
文字列補間に似たスタイルを使用できます。以下の例を参照してください。
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
を使用します。
純粋なスリムでは、raw
もhtml_safe
もありません。これらの場合、文書化されているように二重中括弧を使用してください here :
javascript:
var data = #{{ JSON.dump([{x: 1, y:2}]) }};
次の2つのオプションがあります。
Ruby
セクションを使用しますこのシナリオは、複雑なコードに適しています。
JSONを作成したいRubyオブジェクトがあります。そのため、スリムファイル内にRuby
セクションを作成します。
Ruby:
myObject = @object.to_json.html_safe
注意を払う html_safe
:二重引用符をエスケープしないことが重要です。
次に、myObject
セクション内でjavascript
を使用できます。
javascript:
var data = #{myObject};
単純な場合は、@ fphilipeの回答にあるように、javascript
セクション内で二重中括弧を使用します。
javascript:
var data = #{{@object.to_json}};