Ruby on rails routes.rb中的成员
给定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
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否,因为第一次删除是一个方法,第二次删除是一个符号,字符串是一个值。好吧,但为什么第三行有效而第二行无效,显然是同一个代码,一个使用符号,另一个使用字符串。符号与字符串不同,因此它们没有理由表现相同。好吧,但为什么第三行工作而第二行不工作,显然是相同的代码,一个使用符号,另一个使用字符串。符号与字符串不同,所以他们没有理由表现得一模一样。不确定我是否解释得足够好。所以,任何读过这篇文章的人都会在编辑上下功夫。不确定我是否解释了我的观点 自我感觉很好。所以任何读过这篇文章的人都可以在编辑上下功夫。