假设我的routes.rb文件中有以下代码。
Sum=55
Sum=65
我知道发生了什么(公共网址被映射到将处理并返回请求的特定控制器/视图文件)。这不是我困惑的事情。
作为一名Ruby初学者,我对Ruby代码约定很困惑。它看起来不像是声明变量或调用方法的正确方法吗?到底发生了什么,这是一种调用方法的简写形式?
get '/dashboard', to: 'dashboard#index', :as => 'dashboard'
答案 0 :(得分:3)
这是允许将选项传递给方法的常用方法。如下所示:
def do_something(subject, options = {})
subject.perform_something
subject.perform_caching if options[:cache]
subject.send_report unless options[:skip_reporting]
# etc.
end
所以你可以打电话:
something(some_object)
something(some_object, cache: true)
something(some_object, skip_reporting: true, cache: true)
您甚至可以设置默认值,如下所示:
def do_something_else(subject, options = {})
options = { cache: true, skip_reporting: false }.merge(options)
subject.perform_something
subject.perform_caching if options[:cache]
subject.send_report unless options[:skip_reporting]
end
因此,默认情况下,如果没有cache
选项,则为true
。
答案 1 :(得分:2)
你非常接近。
是的,get
是一种被调用的方法。在ruby中,您可以省略括号。所以,
get '/dashboard', to: 'dashboard#index', :as => 'dashboard'
与:
相同get("/dashboard", to: "dashboard#index", :as => "dashboard")
其中to:
和:as
是get
作为hash
收到的命名参数。
我认为此方法在action_dispatch/routing/mapper.rb
:
module ActionDispatch
module Routing
class Mapper
module HttpHelpers
# Define a route that only recognizes HTTP GET.
# For supported arguments, see match[rdoc-ref:Base#match]
#
# get 'bacon', to: 'food#bacon'
def get(*args, &block)
map_method(:get, args, &block)
end
...
end
end
end
end
因此,您可以看到to: "dashboard#index", :as => "dashboard"
收到*args
,splat operator
允许变量长度参数集。
答案 2 :(得分:1)
get '/dashboard', to: 'dashboard#index', :as => 'dashboard'
这只是一个普通的消息发送(你称之为“方法调用”,但请注意,消息和方法在Ruby中是不同的东西,发送消息的比喻非常重要)
在Ruby中,您可以省略参数列表周围的括号。所以,这与此相同:
get('/dashboard', to: 'dashboard#index', :as => 'dashboard')
您也可以省略发送邮件的接收者,在这种情况下,它隐含为self
,所以这与此相同:
self.get('/dashboard', to: 'dashboard#index', :as => 'dashboard')
如果发送消息的最后一个参数是Hash
字面值,则可以省略大括号,所以这与此相同:
self.get('/dashboard', { to: 'dashboard#index', :as => 'dashboard' })
如果Hash
字面值中的键是Symbol
,则可以写key: value
而不是:key => value
,所以这与此相同:
self.get('/dashboard', { :to => 'dashboard#index', :as => 'dashboard' })
现在,这看起来不像是一个无聊的旧消息吗?
这些规则中的大多数允许您编写看起来更自然的代码。例如, 是其他语言中的关键字的东西,只是Ruby中的方法,如attr_reader
,attr_writer
,attr_accessor
,require
, private
,public
,protected
等。如果您需要在那里使用括号和接收器,那将会很奇怪:
self.protected()
def foo() end
# instead of
protected
def foo() end
# or
self.private(def foo() end)
# instead of
private def foo() end
引入了一个规则,你可以在尾随的Hash
文字周围留下花括号,这样你就可以“伪造”关键字参数:
def route(path, options = {}) end
route(:index, :from => :here, :to => :there)
使用新式符号键更是如此:
route(:index, from: :here, to: :there)
请注意,从Ruby 2.0开始,Ruby还有正确的关键字参数,为了向后兼容,它们看起来像完全,就像尾随的Hash
:
def route(path, from:, to:, with: nil) end
route(:index, from: :here, to: :there) # this line same as above