我正在深入了解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>)>
答案 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"
问题是你的哈希没有正确生成。