有一种方法可以将 ruby 条件放入 javascript block 中吗?即
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}" ;
但我不喜欢它,因为如果配置在 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'
所以我的观点是,有多种方法可以做到这一点,您应该尝试找到最适合您和您的应用程序的方法。在我的例子中,如果我只需要一个或两个值,我会使用我的第一个示例(在更新之前),否则我会选择 ClientConfig
类。
关于javascript block 中的 ruby [slim 模板],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17794403/