我正在通过一个Rails udemy课程,现在正在触摸红宝石的部分(我没有经验,所以这对我来说都是新的)。
在这一部分基本上从权限文件中获取“权限”并将其放入“用户json”。
require 'json'
class User
attr_accessor :email, :name, :permissions
def initialize(*args)
@email = args[0]
@name = args[1]
@permissions = User.permissions_from_template
end
def self.permissions_from_template
file = File.read 'user_permissions_template.json'
JSON.load(file, nil, symbolize_names: true)
end
def save
self_json = {email: @email, name: @name, permissions: @permissions}.to_json
open('users.json', 'a') do |file|
file.puts self_json
end
end
end
有一个简单的runner.rb
文件可以创建用户并对其进行初始化,但这不是我的问题。基本上我的问题是self_json = {email: @email, name: @name, permissions: @permissions}.to_json
我已经阅读了to_json
API并且它很简单,但我看到的每个ruby对象示例都是这样的:{:email => @email, :name => @name, :permissions => @permissions}
,除了用{{1替换@
符号}}
我对"strings"
和@variable
的变量类型感到困惑。
我们是否因为使用:variable
变量或?
:var => @whatever
答案 0 :(得分:1)
它与从实例变量而不是字符串中获取的值无关;所有与它有关的是键是符号。
旧Ruby只有一个对象文字语法,每个键/值对
key => value
e.g。
{ "foo" => "bar", 2 => 4, :name => "value" }
其中"foo"
是字符串键,2
是整数键,:name
是符号键。
然而,发现符号键经常使用,尤其是作为(然后从语言中遗漏)关键字参数的替代功能:
link_to "Delete", thing, :method => :delete, :data => { :confirm => "Sure?" }
实际上是
的快捷方式link_to("Delete", thing, { :method => :delete, :data => { :confirm => "Sure?" } })
为了使这种结构更简洁,更直观地使用关键字,我们开发了一种新的语法作为快捷方式,特别是对于符号的键,其中
key: value
是旧的但相同的替代
:key => value
所以上面的哈希可以写成
{ "foo" => "bar", 2 => 4, name: "value" }
(虽然在这种情况下我不推荐它,因为混合这两种风格有点蠢。)
使用这种新语法,可以编写上述命令:
link_to "Delete", thing, method: :delete, data: { confirm: "Sure?" }
因此,如果你写
,绝对没有区别{ :email => @email, :name => @name, :permissions => @permissions }
或
{ email: @email, name: @name, permissions: @permissions }
目前,后者是首选,因为它更短且更易读。但是,在许多情况下,如果代码自Ruby-1.9之前就已存在,那么人们仍然可以找到旧的语法。