对Ruby on Rails routes.rb语法感到困惑

时间:2017-11-15 19:39:36

标签: ruby-on-rails ruby

假设我的routes.rb文件中有以下代码。

 Sum=55
 Sum=65

我知道发生了什么(公共网址被映射到将处理并返回请求的特定控制器/视图文件)。这不是我困惑的事情。

作为一名Ruby初学者,我对Ruby代码约定很困惑。它看起来不像是声明变量或调用方法的正确方法吗?到底发生了什么,这是一种调用方法的简写形式?

  get '/dashboard', to: 'dashboard#index', :as => 'dashboard'

3 个答案:

答案 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::asget作为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"收到*argssplat 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_readerattr_writerattr_accessorrequireprivatepublicprotected等。如果您需要在那里使用括号和接收器,那将会很奇怪:

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