Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在液体中定位日期?_Ruby On Rails_Ruby On Rails 5_Liquid - Fatal编程技术网

Ruby on rails 如何在液体中定位日期?

Ruby on rails 如何在液体中定位日期?,ruby-on-rails,ruby-on-rails-5,liquid,Ruby On Rails,Ruby On Rails 5,Liquid,在我的Rails 5应用程序中,我使用它让我的用户生成内容 根据我的用户输入,我使用如下内容初始化模板: string = "Order {{ order.id }} was created {{ order.date | date: '%A %d/%m-%Y' }}" template = Liquid::Template.parse(string) result = template.render({'order' => {'id' => '123', 'date' =&

在我的Rails 5应用程序中,我使用它让我的用户生成内容

根据我的用户输入,我使用如下内容初始化模板:

string   = "Order {{ order.id }} was created {{ order.date | date: '%A %d/%m-%Y' }}"
template = Liquid::Template.parse(string)
result   = template.render({'order' => {'id' => '123', 'date' => order.date}})
en:
  datetime: &datetime
    month_names:
      [~, January, February, March, April, May, June, July, August, September, October, November, December]
    day_names:
      [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
    abbr_day_names:
      [~, Sun, Mon, Thue, Wed, Thu, Fri, Sat]
    formats:
       default: "%d/%m/%Y"
       long: "%A %d/%m-%Y"
这将打印出一个la:

'Order 123 was created Sunday 14/01-2018'
但我如何在Rails应用程序中构建Liquid date本地化

这一点在欧洲似乎不受支持。不过

我想我需要向模板传递一个区域设置(
en
fr
,等等)和一个区域设置文件。我的Rails区域设置文件如下所示:

string   = "Order {{ order.id }} was created {{ order.date | date: '%A %d/%m-%Y' }}"
template = Liquid::Template.parse(string)
result   = template.render({'order' => {'id' => '123', 'date' => order.date}})
en:
  datetime: &datetime
    month_names:
      [~, January, February, March, April, May, June, July, August, September, October, November, December]
    day_names:
      [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
    abbr_day_names:
      [~, Sun, Mon, Thue, Wed, Thu, Fri, Sat]
    formats:
       default: "%d/%m/%Y"
       long: "%A %d/%m-%Y"
我称之为:

l(order.date, :format => :long, :locale => 'en')

我希望能够在我的Liquid模板中访问类似的日期本地化功能。

当您使用order.date传递日期对象时

result   = template.render({'order' => {'id' => '123', 'date' => order.date}})
您可以传递本地化日期或本地化日期时间吗?然后,当它被渲染时,它应该是正确的

否则,您可以将日期添加到一个具有可以作为目标的类名(用于回退)的范围中,并在客户端使用纯Javascript和类似库的组合来“修复”它


看起来您只缺少了对
t
方法的引用

而不是

string   = "Order {{ order.id }} was created {{ order.date | date: '%A %d/%m-%Y' }}"
试一试

string   = "Order {{ order.id }} was created {{ order.date | t: date: '%A %d/%m-%Y' }}"

我最终使用了@Ben提供的链接,并编写了以下解决方案:

# config/initializers/liquid_filters.rb
module I18nFilters
  def l(date, format)
    I18n.l(date, :format => format.to_sym)
  end
end

Liquid::Template.register_filter(I18nFilters)
现在,当调用该新方法时:

{{ order.date | l: 'long' }}
它将打印出:

'Sunday 14/01-2018'

使用区域设置文件,
Sunday
作为
day\u名称中的任何内容。

您可以故意调用
I18n.localize
?似乎相关-它显示了如何故意传入区域设置并使用自定义的日期格式(但请注意,我花了整整5秒钟思考这个问题…?感谢@Ben,我使用这种方法注册了一个过滤器,该过滤器执行
l(order.date,:format=>:long,:locale=>'en')
。如果没有其他人想出更好的解决办法,我会把它写下来作为答案。但这不是一个完美的方法,因为它限制了我使用一组预定义的
格式。但第一个建议对我来说更像是一个问题。我不确定我是否理解。抱歉的话很难说。:)当您将order.date传递给liquid模板时,我假设您知道为其显示数据的人员的区域设置,如果不知道,您可以在rails中执行此操作。这将允许您将正确本地化的日期传递给模板。