Helpex - Trao đổi & giúp đỡ Đăng nhập
71

Các biến trong tập tin YAML có thể không? Ví dụ:

theme:
  name: default
  css_path: compiled/themes/$theme.name
  layout_path: themes/$theme.name

Trong ví dụ này, làm thế nào có thể theme: name: defaultđược sử dụng trong các cài đặt khác? Cú pháp là gì?

71 hữu ích 5 bình luận 87k xem chia sẻ
93

Tôi đã có câu hỏi tương tự, và sau rất nhiều nghiên cứu, có vẻ như điều đó là không thể .

Câu trả lời từ cgat là đi đúng hướng, nhưng bạn thực sự không thể nối các tài liệu tham khảo như thế.

Dưới đây là những điều bạn có thể làm với "biến" trong YAML (được gọi chính thức là "nút neo" khi bạn đặt chúng và "tham chiếu" khi bạn sử dụng chúng sau này):

Xác định một giá trị và sử dụng một bản sao chính xác của nó sau:

default: &default_title This Post Has No Title
title: *default_title

{ hoặc là }

example_post: &example
  title: My mom likes roosters
  body: Seriously, she does. And I don't know when it started.
  date: 8/18/2012
first_post: *example
second_post:
  title: whatever, etc.

Để biết thêm thông tin, hãy xem phần này của trang wiki về YAML: http://en.wikipedia.org/wiki/YAML#References

Xác định một đối tượng và sử dụng nó với các sửa đổi sau:

default: &DEFAULT
  URL:          stooges.com
  throw_pies?:  true  
  stooges:  &stooge_list
    larry:  first_stooge
    moe:    second_stooge
    curly:  third_stooge

development:
  <<: *DEFAULT
  URL:      stooges.local
  stooges: 
    shemp: fourth_stooge

test:
  <<: *DEFAULT
  URL:    test.stooges.qa
  stooges: 
    <<: *stooge_list
    shemp: fourth_stooge

Điều này được lấy trực tiếp từ một bản demo tuyệt vời tại đây: https://gist.github.com/bowsersenior/979804

93 hữu ích 3 bình luận chia sẻ
42

Sau một số tìm kiếm, tôi đã tìm thấy một giải pháp sạch hơn sử dụng %toán tử.

Trong tệp YAML của bạn:

key : 'This is the foobar var : %{foobar}'

Trong mã ruby ​​của bạn:

require 'yaml'

file = YAML.load_file('your_file.yml')

foobar = 'Hello World !'
content = file['key']
modified_content = content % { :foobar => foobar }

puts modified_content

Và đầu ra là:

This is the foobar var : Hello World !

Như @jschorr đã nói trong bình luận, bạn cũng có thể thêm nhiều biến vào giá trị trong tệp Yaml:

Yaml:

key : 'The foo var is %{foo} and the bar var is %{bar} !'

Ruby:

# ...
foo = 'FOO'
bar = 'BAR'
# ...
modified_content = content % { :foo => foo, :bar => bar }

Đầu ra:

The foo var is FOO and the bar var is BAR !
42 hữu ích 3 bình luận chia sẻ
3

Đây là một bài viết cũ, nhưng tôi có một nhu cầu tương tự và đây là giải pháp tôi đã đưa ra. Đó là một chút hack, nhưng nó hoạt động và có thể được tinh chế.

require 'erb'
require 'yaml'

doc = <<-EOF
  theme:
  name: default
  css_path: compiled/themes/<%= data['theme']['name'] %>
  layout_path: themes/<%= data['theme']['name'] %>
  image_path: <%= data['theme']['css_path'] %>/images
  recursive_path: <%= data['theme']['image_path'] %>/plus/one/more
EOF

data = YAML::load("---" + doc)

template = ERB.new(data.to_yaml);
str = template.result(binding)
while /<%=.*%>/.match(str) != nil
  str = ERB.new(str).result(binding)
end

puts str

Một nhược điểm lớn là nó tích hợp vào tài liệu yaml một tên biến (trong trường hợp này là "dữ liệu") có thể tồn tại hoặc không tồn tại. Có lẽ một giải pháp tốt hơn sẽ là sử dụng $ và sau đó thay thế nó bằng tên biến trong Ruby trước ERB. Ngoài ra, chỉ cần thử nghiệm bằng cách sử dụng hashes2osturation , cho phép ký hiệu loại data.theme.name dễ nhìn hơn nhiều. Tất cả những gì được yêu cầu là bọc tải YAML :: với điều này

data = hashes2ostruct(YAML::load("---" + doc))

Sau đó, tài liệu YAML của bạn có thể trông như thế này

doc = <<-EOF
  theme:
  name: default
  css_path: compiled/themes/<%= data.theme.name %>
  layout_path: themes/<%= data.theme.name %>
  image_path: <%= data.theme.css_path %>/images
  recursive_path: <%= data.theme.image_path %>/plus/one/more
EOF
3 hữu ích 0 bình luận chia sẻ
0

Khung Rails / ruby ​​có thể thực hiện một số khuôn mẫu ... nó thường được sử dụng để tải các biến env ...

# fooz.yml
  foo:
    bar: <%= $ENV[:some_var] %>

Không biết điều này có hiệu quả với các khung javascript không vì tôi nghĩ rằng định dạng YML là siêu dữ liệu của json và nó phụ thuộc vào những gì đọc tệp yml cho bạn.

Nếu bạn có thể sử dụng mẫu như thế hoặc kiểu << >>hoặc {{ }}tùy thuộc vào người đọc của bạn, sau đó bạn chỉ cần ...

Trong một tệp yml khác ...

# boo.yml

development:
  fooz: foo

Điều này cho phép bạn về cơ bản chèn một biến làm tham chiếu tệp gốc của bạn mỗi lần được đặt động. Khi đọc tôi cũng thấy bạn có thể tạo hoặc mở các tệp YML dưới dạng các đối tượng đang di chuyển cho một số ngôn ngữ cho phép bạn tạo một tệp & chuỗi viết một loạt các tệp YML hoặc chỉ có tất cả chúng được trỏ tĩnh vào một ngôn ngữ được tạo động.

0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ ruby-on-rails ruby variables yaml string-interpolation , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading