Ruby on rails routes.rb中的成员

Ruby on rails routes.rb中的成员,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,给定routes.rb中的代码: resources :products do member do get :delete #this works delete delete: "products#destroy" #this doesn't work delete "delete" => "products#destroy" #but this works end end 为什么delete-delete:productsde

给定routes.rb中的代码:

  resources :products do
    member do
      get :delete #this works
      delete delete: "products#destroy" #this doesn't work
      delete "delete" => "products#destroy" #but this works
    end
  end
为什么delete-delete:productsdestroy行不起作用,而delete-delete=>productsdestroy行起作用


Rails 3.2.11版

如果要将删除操作映射到销毁,则应使用match

但我看不出有什么理由这么做。在我看来,你应该坚持rails默认的销毁操作


它不起作用,因为在资源中,您已经指定了控制器,并且它用于添加具有正确http协议的操作

如果要将删除操作映射到销毁,则应使用匹配

但我看不出有什么理由这么做。在我看来,你应该坚持rails默认的销毁操作


而且它不起作用,因为在资源中,您已经指定了控制器,并且它用于添加具有适当http协议的操作,只有Ruby版本1.9才支持新的哈希语法。您使用的是哪个版本的Ruby?

只有Ruby 1.9版才支持新的哈希语法。您使用的是哪个版本的Ruby?

这不起作用的原因以及如果您遵循错误回溯,是因为Rails中mapper.rb中的以下行

def match(path, *rest)
  if rest.empty? && Hash === path
    options  = path
    path, to = options.find { |name, value| name.is_a?(String) }
    options[:to] = to
    options.delete(path)
    paths = [path]
  else
    options = rest.pop || {}
     paths = [path] + rest
  end

  options[:anchor] = true unless options.key?(:anchor)

  if options[:on] && !VALID_ON_OPTIONS.include?(options[:on])
    raise ArgumentError, "Unknown scope #{on.inspect} given to :on"
  end
  paths.each { |_path| decomposed_match(_path, options.dup) }
  self
end
这是由所有幕后方法调用的,例如delete、post、get、put。我们特别寻找的产品线如下:

path, to = options.find { |name, value| name.is_a?(String) }
不确定他们为什么要检查字符串,但因为名称是一个符号,而不是字符串,而是一个符号。这几乎将该路径作为一个nil值发送到分解的_匹配中,从而在线路的某个地方导致无法在路由中使用符号的原因

get:delete之所以有效,是因为在调用match方法之前有一行代码

特别是在这种方法下

def map_method(method, *args, &block)
  options = args.extract_options!
  options[:via] = method
  args.push(options)
  match(*args, &block)
  self
end
行args.extract\u选项!从数组中删除散列。您可以在extract_options.rb文件下找到它,该文件是类数组中添加的方法

无论如何,由于get:delete不是散列,而是单个参数,所以它被映射到如下内容

Path: [delete]
Options [{via: "get"}]
现在,其他的被映射如下,例如delete-delete:productdestroy


然后回到我最初的陈述,关于为什么符号在路由中不起作用。

这不起作用的原因以及如果您遵循错误回溯,是因为Rails中的mapper.rb中有以下行

def match(path, *rest)
  if rest.empty? && Hash === path
    options  = path
    path, to = options.find { |name, value| name.is_a?(String) }
    options[:to] = to
    options.delete(path)
    paths = [path]
  else
    options = rest.pop || {}
     paths = [path] + rest
  end

  options[:anchor] = true unless options.key?(:anchor)

  if options[:on] && !VALID_ON_OPTIONS.include?(options[:on])
    raise ArgumentError, "Unknown scope #{on.inspect} given to :on"
  end
  paths.each { |_path| decomposed_match(_path, options.dup) }
  self
end
这是由所有幕后方法调用的,例如delete、post、get、put。我们特别寻找的产品线如下:

path, to = options.find { |name, value| name.is_a?(String) }
不确定他们为什么要检查字符串,但因为名称是一个符号,而不是字符串,而是一个符号。这几乎将该路径作为一个nil值发送到分解的_匹配中,从而在线路的某个地方导致无法在路由中使用符号的原因

get:delete之所以有效,是因为在调用match方法之前有一行代码

特别是在这种方法下

def map_method(method, *args, &block)
  options = args.extract_options!
  options[:via] = method
  args.push(options)
  match(*args, &block)
  self
end
行args.extract\u选项!从数组中删除散列。您可以在extract_options.rb文件下找到它,该文件是类数组中添加的方法

无论如何,由于get:delete不是散列,而是单个参数,所以它被映射到如下内容

Path: [delete]
Options [{via: "get"}]
现在,其他的被映射如下,例如delete-delete:productdestroy


然后回到我最初的陈述,即为什么符号在路线中不起作用。

为什么会起作用?-第二次删除在我看来是假的。@gg\s否,这是hashmap的新ruby语法。在第二个版本中不应该删除:be:delete吗?我找不到您试图在文档或指南中使用的符号。足智多谋的路由意味着简单,并使用CoC范式。路由中的路径应与控制器中的方法名称相同。@RoddyOfFrozenPeas否,因为第一次删除是一个方法,第二次删除是一个符号,字符串是一个值。为什么它会起作用?-第二次删除在我看来是假的。@gg\s否,这是hashmap的新ruby语法。在第二个版本中不应该删除:be:delete吗?我找不到您试图在文档或指南中使用的符号。足智多谋的路由意味着简单,并使用CoC范式。路由中的路径应该与控制器中的方法名相同。@RoddyOfFrozenpeas否,因为第一次删除是一个方法,第二次删除是一个符号,字符串是一个值。好吧,但为什么第三行有效而第二行无效,显然是同一个代码,一个使用符号,另一个使用字符串。符号与字符串不同,因此它们没有理由表现相同。好吧,但为什么第三行工作而第二行不工作,显然是相同的代码,一个使用符号,另一个使用字符串。符号与字符串不同,所以他们没有理由表现得一模一样。不确定我是否解释得足够好。所以,任何读过这篇文章的人都会在编辑上下功夫。不确定我是否解释了我的观点 自我感觉很好。所以任何读过这篇文章的人都可以在编辑上下功夫。