【问题标题】:Params, why are double quotes needed to extract the values?参数,为什么需要双引号来提取值?
【发布时间】:2014-04-27 21:12:37
【问题描述】:

我正在深入研究 Sinatra 的登录过程。

Login.erb

<div id="flash" class="failure">
<h2>  <%= flash[:failure] %> </h2>
</div>


<a href="/welcome">Go Back</a>


<% if @user.nil? == false %>

<% if @user.errors.any? %>

<%= erb 'shared/_error_messages'.to_sym %>

<form action="/users/signin" method="post">
<p> User Login</p>

<label> Email <input type="text" name="[:session][:email]"/> </label></br>
<label> Password <input type="password" name="[:session][:password]"/> </label></br>

<input type="submit" value="Log in">

</form>
<% end %>

<% else %>

<form action="/users/signin" method="post">
<p> User Login</p>
<label> Email <input type="text" name="[:session][:email]"/> </label></br>
<label> Password <input type="password" name="[:session][:password]"/> </label></br>
<input type="submit" value="Log in">

</form>

<% end %>

当我使用 binding.pry 来确定我们提交发布请求时会发生什么时,我看到我会得到以下信息:

[1] pry(#<Sinatra::Application>)> params
{
    ":session" => {
           ":email" => "tasha@gmail.com",
        ":password" => "123"
    }
}

我知道我有一个带有键值对的散列。

我想知道为什么我需要在括号中的符号周围加上引号,而不是让它独立出来以提取值?另外,如果我在不带双引号的情况下命名它,为什么在我请求 pry 中的参数时要添加双引号?

[2] pry(#<Sinatra::Application>)> params[:session]
nil
 [3] pry(#<Sinatra::Application>)> params[":session"]
 {
       ":email" => "tasha@gmail.com",
     ":password" => "123"
 }
[4] pry(#<Sinatra::Application>)> params[:session][:email]
 NoMethodError: undefined method `[]' for nil:NilClass
from (pry):31:in `block in <main>'
[5] pry(#<Sinatra::Application>)> params[":session"][":email"]
"tasha@gmail.com"
[6] pry(#<Sinatra::Application>)> 

【问题讨论】:

    标签: ruby login sinatra


    【解决方案1】:

    您的电子邮件字段name字符串 [:session][:email],它被解析为哈希,带有字符串类型键:

    {
      ":session" => {
        ":email" => value
      }
    }
    

    这些字符串键以冒号开头。 它们不是符号!

    params[:session] 将从params["session"] 中提取。这是因为符号的字符串版本不包含: 前缀。

    :session.to_s #=> "session"
    

    您可能只想在模板中使用它。

    name="[session][email]"
    

    【讨论】:

    • 谢谢!!那时候我想过那个。出于某种原因,我看到人们喜欢将冒号放在括号内,但我想这不是必需的。
    • 你应该阅读 the difference between strings and symbols. 了解 ruby​​ 很重要。
    【解决方案2】:

    注意您当前参数哈希中的键。

    params
    {
        ":session" => {
               ":email" => "tasha@gmail.com",
            ":password" => "123"
        }
    }
    

    您需要访问参数中定义的键。例如:":session"

    问题是您的哈希没有正确生成。

    【讨论】:

    • 谢谢,我要不要改个名字?
    • 是的,问题在于您在 erb 文件中添加的 : 前缀。请按照@AlexWayne 的建议更新 erb。这应该可以解决不正确的密钥生成问题。
    猜你喜欢
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2014-01-10
    • 2011-05-10
    相关资源
    最近更新 更多