有一种方法可以将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之间有共同的值,那么我会复制我的代码并且会更大并且难以维护。
更新了更好的例子
答案 0 :(得分:32)
您可以使用类似于字符串插值的样式。见下面的例子。
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'
所以我的观点是,有多种方法可以做到这一点,你应该尝试找到最适合你和你的应用程序的方式。在我的情况下,我会使用我的第一个例子(在更新之前),如果我只需要一个或两个值,那么我会选择ClientConfig
类。
答案 1 :(得分:20)
在纯粹的Slim中,你没有raw
也没有html_safe
。在这些情况下,只需使用记录为here的双花括号:
javascript:
var data = #{{ JSON.dump([{x: 1, y:2}]) }};
答案 2 :(得分:8)
您有两个选择:
(defun make-pair (l)
(when (and l (cdr l))
(append (mapcar #'(lambda (x) (list (car l) x)) (cdr l))
(make-pair (cdr l)))))
(make-pair '(1 d 2 c)) => ((1 D) (1 2) (1 C) (D 2) (D C) (2 C))
部分此方案适用于复杂代码。
我有一个ruby对象,我想制作一个JSON。所以,在我的苗条文件中,我将创建一个ruby
部分:
ruby
注意ruby:
myObject = @object.to_json.html_safe
:重要的是不要逃避双引号。
然后您可以在html_safe
部分中使用myObject
:
javascript
对于简单的情况,请使用javascript:
var data = #{myObject};
部分中的双花括号,如@fphilipe中所述:
javascript