首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对Ruby on Rails routes.rb语法感到困惑

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

Stack Overflow用户
提问于 2017-11-16 03:39:36
回答 3查看 221关注 0票数 2

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

代码语言:javascript
复制
  get '/dashboard', to: 'dashboard#index', :as => 'dashboard'

我知道这是怎么回事(一个公共url被映射到一个特定的控制器/视图文件,它将处理并返回请求)。这不是我困惑的地方。

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

代码语言:javascript
复制
get("/dashboard", "dashboard#index", "dashboard")
EN

回答 3

Stack Overflow用户

发布于 2017-11-16 03:54:51

这是允许将选项传递给方法的一种常见方式。如下所示:

代码语言:javascript
复制
def do_something(subject, options = {})
  subject.perform_something
  subject.perform_caching if options[:cache]
  subject.send_report unless options[:skip_reporting]
  # etc.
end

因此,您可以调用:

代码语言:javascript
复制
something(some_object)
something(some_object, cache: true)
something(some_object, skip_reporting: true, cache: true)

您甚至可以设置默认值,如下所示:

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2017-11-16 03:43:08

你已经很接近了。

是的,get是一个被调用的方法。在拼音中,您可以省略括号。所以,

代码语言:javascript
复制
get '/dashboard', to: 'dashboard#index', :as => 'dashboard'

与以下内容相同:

代码语言:javascript
复制
get("/dashboard", to: "dashboard#index", :as => "dashboard")

其中to::as是由get作为hash接收的命名参数。

我认为这个方法是在action_dispatch/routing/mapper.rb中定义的

代码语言:javascript
复制
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允许一组可变长度的参数。

票数 2
EN

Stack Overflow用户

发布于 2017-11-16 15:20:58

代码语言:javascript
复制
get '/dashboard', to: 'dashboard#index', :as => 'dashboard'

这只是一个普通的消息发送(您称之为“方法调用”,但请注意,在Ruby中消息和方法是不同的东西,发送消息的比喻非常重要)。

在Ruby中,允许省略参数列表周围的括号。因此,这与下面的内容相同:

代码语言:javascript
复制
get('/dashboard', to: 'dashboard#index', :as => 'dashboard')

您还可以省略消息send的接收者,在这种情况下,它隐含为self,因此这与以下内容相同:

代码语言:javascript
复制
self.get('/dashboard', to: 'dashboard#index', :as => 'dashboard')

如果消息发送的最后一个参数是Hash文本,则允许省略大括号,因此与以下内容相同:

代码语言:javascript
复制
self.get('/dashboard', { to: 'dashboard#index', :as => 'dashboard' })

如果Hash文本中的键是Symbol,则允许您编写key: value而不是:key => value,因此与以下内容相同:

代码语言:javascript
复制
self.get('/dashboard', { :to => 'dashboard#index', :as => 'dashboard' })

现在,这看起来是不是就像一个无聊的老消息发送?

这些规则中的大多数都是为了让你写出看起来更自然的代码。例如,在其他语言中可能是关键字的东西,在Ruby语言中只是方法,比如attr_readerattr_writerattr_accessorrequireprivatepublicprotected等等。如果你被要求在那里使用括号和接收器,这看起来会很奇怪:

代码语言:javascript
复制
self.protected()
def foo() end
# instead of
protected
def foo() end

# or

self.private(def foo() end)
# instead of
private def foo() end

引入了可以省略尾随Hash文字两边的花括号的规则,以便您可以“伪造”关键字参数:

代码语言:javascript
复制
def route(path, options = {}) end
route(:index, :from => :here, :to => :there)

新样式的符号键更是如此:

代码语言:javascript
复制
route(:index, from: :here, to: :there)

请注意,从Ruby2.0开始,Ruby也有适当的关键字参数,为了向后兼容,这些参数看起来就像一个尾随的Hash

代码语言:javascript
复制
def route(path, from:, to:, with: nil) end
route(:index, from: :here, to: :there) # this line same as above
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47315898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档