参数,为什么提取值需要双引号?

时间:2014-03-20 19:11:59

标签: ruby login sinatra

我正在深入了解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>)> 

2 个答案:

答案 0 :(得分:2)

您对电子邮件的name字段是字符串 [:session][:email],它使用字符串类型键解析为哈希:

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

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

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

:session.to_s #=> "session"

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

name="[session][email]"

答案 1 :(得分:1)

注意当前params散列中的键。

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

您需要在定义时访问参数中的密钥。例如:":session"

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