假设我的routes.rb文件中有以下代码。
get '/dashboard', to: 'dashboard#index', :as => 'dashboard'我知道这是怎么回事(一个公共url被映射到一个特定的控制器/视图文件,它将处理并返回请求)。这不是我困惑的地方。
作为一名Ruby初学者,我对这是什么Ruby代码约定感到困惑。它看起来不像是声明变量或调用方法的正确方式?这到底是怎么回事,这是一种调用方法的简写形式吗?
get("/dashboard", "dashboard#index", "dashboard")发布于 2017-11-16 03:54:51
这是允许将选项传递给方法的一种常见方式。如下所示:
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。
发布于 2017-11-16 03:43:08
你已经很接近了。
是的,get是一个被调用的方法。在拼音中,您可以省略括号。所以,
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因此,您可以看到*args接收到to: "dashboard#index", :as => "dashboard",并且splat operator允许一组可变长度的参数。
发布于 2017-11-16 15:20:58
get '/dashboard', to: 'dashboard#index', :as => 'dashboard'这只是一个普通的消息发送(您称之为“方法调用”,但请注意,在Ruby中消息和方法是不同的东西,发送消息的比喻非常重要)。
在Ruby中,允许省略参数列表周围的括号。因此,这与下面的内容相同:
get('/dashboard', to: 'dashboard#index', :as => 'dashboard')您还可以省略消息send的接收者,在这种情况下,它隐含为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)请注意,从Ruby2.0开始,Ruby也有适当的关键字参数,为了向后兼容,这些参数看起来就像一个尾随的Hash
def route(path, from:, to:, with: nil) end
route(:index, from: :here, to: :there) # this line same as abovehttps://stackoverflow.com/questions/47315898
复制相似问题