基本上问题是关于ruby语法
class Person < ActiveRecord::Base
validates :name, presence: true #no error
end
我的2个问题
1
对我而言,此代码validates :name, presence: true
看起来像是对方法的调用。
如何在任何方法之外调用类体内的方法?我认为它在oops中是不可能的。
2
为什么我在这两种变体中出现错误
validates (:name , presence: true) #error
或
validates (:name , {presence: true}) #error
我在方法调用中添加了括号,因为它在ruby中是允许的。 第一个参数是符号,第二个参数是哈希。
在第一种情况下,我没有添加花括号来哈希,因为我读到如果最后一个参数是哈希你可以留下花括号,在第二个代码我已经明确添加花括号但仍然有错误。
任何人都可以解释这种语法。
由于
修改1
错误
首先我得到了
product.rb:8:语法错误,意外&#39;,&#39;,期待&#39;)&#39; validates(:name,presence:true)#error ^
第二,我正在
product.rb:10:语法错误,意外&#39;,&#39;,期待&#39;)&#39;验证(:title,{presence:true})#error ^
答案 0 :(得分:3)
1:在ruby中,可以在定义类时调用方法:
% irb
2.2.2 :001 > class Dummy
2.2.2 :002?> puts "Making a class..."
2.2.2 :003?> def hello
2.2.2 :004?> puts "Hello"
2.2.2 :005?> end
2.2.2 :006?> end
Making a class...
=> :hello
2.2.2 :007 > d = Dummy.new
=> #<Dummy:0x000000009ebbf0>
2.2.2 :008 > d.hello
Hello
=> nil
所以这正是发生的事情。
2:由于方法名称和参数列表之间有空格,因此出现错误:
% irb
2.2.3 :001 > def func(*splat)
2.2.3 :002?> puts splat.inspect
2.2.3 :003?> end
=> :func
2.2.3 :004 > func(:test, :another => :test)
[:test, {:another=>:test}]
=> nil
2.2.3 :005 > func (:test)
[:test]
=> nil
2.2.3 :006 > func (:test, :another => :test)
SyntaxError: (irb):6: syntax error, unexpected ',', expecting ')'
func (:test, :another => :test)
^
from /home/haraldei/.rvm/rubies/ruby-2.2.3/bin/irb:11:in `<main>'
上面的第二个例子,我只传递一个arg,因为你可以在括号中包含任何有效的表达式。这与参数列表不同。所以表达式:
(:test, :another => :test)
不是有效的表达式,但解析器会尝试将其作为一个带括号的参数传递给方法。
总而言之,如果你删除它们之间的空格和函数名,你的参数列表都是正确的。
答案 1 :(得分:2)
你的第一个问题的答案:“是的,这是一种方法”,这也是你第二个问题的答案。
你的第二个问题的答案是“删除验证之间的空格和(”。当validates (...)
时它会抛出
syntax error, unexpected ',', expecting ')' (SyntaxError)
validates (:name , presence: true)
validates
是一种方法,如果使用括号,则不得使用空格。