新手问题 怎么看待 link_to 方法里的参数规则?

Vale · 2015年03月03日 · 最后由 blacktulip 回复于 2015年03月03日 · 2232 次阅读
link_to 'Destroy', article_path(article), method: :delete, data: { confirm: 'Are you sure?'}

上面的 link_to 函数让我手写的话,目前我是写不出来啊。 link_to 是函数名

'Destroy' 是第一个参数 article_path(article) 第二个参数 method: :delete 这个是什么鬼?是一个 hash 吗,hash 的 key 和 value 都是 symbol 类型? data: { confirm: 'Are you sure?'} 这个又是什么鬼?一个 hash,然后它的 value 值是一个 hash 吗? 我这样分析对吗?请大神指点。

link_to(name = nil, options = nil, html_options = nil, &block) lz 不知道有个东西叫 api 文档么? http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

method: :delete, data: { confirm: 'Are you sure?'}

等效于

hash = {}
hash[:method] = :delete
hash[:data] = {}
hash[:data][:confirm] = "Are you sure?"

等效于

{
  :method => :delete,
  :data => {
    :confirm => "Are you sure?"
  }
}

link_to 'Destroy', article_path(article), method: :delete, data: { confirm: 'Are you sure?'}

里面

method: :delete, data: { confirm: 'Are you sure?'}

属于第三个参数

'Destroy' 是第一个参数 article_path(article) 第二个参数

method: :delete, data: { confirm: 'Are you sure?'} 对应第三个参数,外面省略了大括号而矣。外号:祼哈希

#3 楼 @ery 很详细 谢啦

#3 楼 @ery 很详细 谢啦

#4 楼 @leekelby 这也太简化了 遇到陌生的函数根本推断不出来参数的类型 有推断参数类型的办法吗?就比如说我怎么知道他不是第四个参数 而是一个裸哈希?

#8 楼 @Vale 这是 Ruby 的语言特性,当参数列表最后是几个 key-value pair 的时候,Ruby 自动将其合成一个 Hash,作为一个参数传入。 另一种表述方法是,当 Hash 作为参数列表的最后一个参数传入时,可以省略大括号。

所以当你看到参数列表最后有好几个 key-value 对的时候,就要反应过来这只是一个参数

自己写的时候,一开始可以不省略,等熟了再省掉。比方为了清晰你也可以写成这样

link_to('Destroy',
        article_path(article),
        { 
            method: :delete,
            data: { 
                confirm: 'Are you sure?' 
            }
        })

不过我觉得这样就更乱了..... 要不你就每个参数写一行


link_to('Destroy',
        article_path(article),
        { method: :delete, data: { confirm: 'Are you sure?' } })

#9 楼 @blacktulip 很详细,十分感谢。swift 里面也有类似的特性:如果最后一个参数是 block,可以把 block 放在括号的外面。

#10 楼 @Vale Ruby 用 block 做参数也是放外面的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号