【问题标题】:Local variables in a block that are not passed as parameters [duplicate]块中未作为参数传递的局部变量[重复]
【发布时间】:2020-02-11 11:40:02
【问题描述】:

我正在尝试了解如何使变量可用于未作为参数传递给块的块。

例如,Sinatra 如何使params 哈希可用?

get '/hello/:name' do
  howAmIAccessingThis = params[:name]
end

params 来自哪里?这个:

get '/hello/:name' do |params|
  @hisName = params[:name]
end

可能有意义,因为params 被声明为块参数,但这不是它的工作方式。查看源代码,我无法找到 params 哈希是如何在没有块参数的情况下传递给块的。

【问题讨论】:

  • 我不相信这是重复的,因为它询问的是如何访问 param 变量,而不是哈希中的变量来自哪里。
  • 不是重复的。当涉及到关于 Ruby 语言的问题时,被标记为“sinatra”已经引起了很多混乱。这个问题有答案。

标签: ruby


【解决方案1】:

如果它不是局部变量或块变量,那么它就是一个方法。我不知道 Sinatra,但一定有一个方法 params 定义在某个地方。

【讨论】:

  • 这已经足够老了,以至于当时的源可能已经不同,但是 Sinatra::Base 有一个用于参数的 attr 访问器。我会给出一个完整的答案,但是这个话题已经结束了。
【解决方案2】:

使用参数

Sinatra 中的参数和其他所有东西一样——简单明了。

#!/usr/bin/env ruby
require 'rubygems'
require 'sinatra'

get '/hello/:name' do
  "Hello #{params[:name]}!"
end

完成此更改后,您需要重新启动 Sinatra 应用程序。用 Ctrl-C 杀死它并再次运行它。 (有一种解决方法,但我们将在以后的文章中讨论。)现在,参数很简单。我们执行了一个名为/hello/:name 的操作。这种语法是在模仿 URL 的样子,所以转到 http://localhost:4567/hello/Your Name 看看它的实际效果。

/hello 部分与您发出的请求中的 URL 部分相匹配,并且 :name 将吸收您提供的任何其他文本并将其放在键 :name 下的 params 哈希中。参数就是这么简单。当然,您可以使用这些做更多事情,包括基于正则表达式的参数,但这几乎是所有情况下您所需要的。

参考:http://ruby.about.com/od/sinatra/a/sinatra2.htm

编辑

params 值可以来自 GET 请求的查询字符串,也可以来自 POST 请求的表单数据,但它们还可以来自第三个地方:URL 的路径。

您可能知道,Rails 使用称为路由的东西将请求定向到相应的控制器操作。这些路由可能包含从 URL 中提取并放入 params 的段。例如,如果您有这样的路线:

匹配 'products/:id', ... 然后对http://example.com/products/42 之类的 URL 的请求会将 params[:id] 设置为 42

因此,只要 URL GET、POST 或 Path 包含此类模式,则 rails 会自动构造 params 哈希。

还要检查参数部分(第 4 节)here

【讨论】:

  • 我知道如何使用 Sinatra,我只是想知道 Sinatra 如何在后台传递参数哈希。
  • 好的,那你想知道如何在 Sinatra 中将 :name 转换为 params[:name]...
  • 在这种情况下,请通过此链接stackoverflow.com/questions/6885990/rails-params-explained
  • 我知道如何使用它,我想知道 如何 sinatra 将它传递到块中,因为它没有在任何地方定义(块参数等)。
  • 仍然没有回答问题.....我想知道 如何 sinatra 是如何传递参数哈希的。它在哪里声明?
猜你喜欢
  • 2013-01-02
  • 2018-08-30
  • 1970-01-01
  • 2017-05-15
  • 2011-09-10
  • 2016-03-28
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
相关资源
最近更新 更多