回答。见文末。
我主要是一名 Java 开发人员,并且对 Ruby on Rails 相当陌生。我已成功完成 railstutorial.org 上的教程。所以我让这个工作一次。当我第二次开始阅读本教程时出现了我的问题,但这次尝试用 Sorcery gem 替换身份验证。我的主要参考是railscasts.org 上的第 283 集。其中一些正在工作,但是当我尝试登录时,我收到一条错误消息:
SessionsController#create 中的 ActiveRecord::PreparedStatementInvalid
[:email] = :login 中的 :email 缺失值
这是一件很难搜索的事情,因为它非常具体,但在很多地方都出现了非常笼统的词。我认为当我让它工作时,我正在以与原始教程相同的方式做事。下面是我的views/sessions/new.html.erb,它和原来的教程差不多。
<% provide(:title, "Sign in") %>
<h1>Sign in</h1>
<div class="row">
<div class="span6 offset3">
<%= form_for(:session, url: sessions_path) do |f| %>
<%= f.label :email %>
<%= f.text_field :email %>
<%= f.label :password %>
<%= f.password_field :password %>
<%= f.check_box :remember_me %>
<%= f.label :remember_me %>
<%= f.submit "Sign in", class: "btn btn-large btn-primary" %>
<% end %>
<p>New user? <%= link_to "Sign up now!", signup_path %></p>
</div>
</div>
这是我的 session_controller.rb 中的 create 方法,由于巫术,它与教程略有不同,但我不知道为什么 params 引用的工作方式与教程中的不同:
def create
user = login(params[:session][:email], params[:session][:password])
if user
redirect_back_or_to root_url, :notice => "Logged in!"
else
flash.now[:error] = 'Invalid email/password combination' # Not quite right!
render 'new'
end
end
rails cast 只使用 params[:email] 但那是因为他使用 form_tag 而不是 form_for 并更改了要使用的参数。
我真的迷路了。不知道为什么它与教程的工作方式不同。任何帮助将不胜感激。让我知道我是否应该提供任何其他信息。谢谢。
编辑:
添加了上面的完整错误。一定是巫术的登录方式或者我的数据库有问题。参数很好。这是完整的堆栈跟踪(回到我的代码部分。它真的太长了。)
堆栈跟踪:
activerecord (3.2.11) lib/active_record/sanitization.rb:141:in `block in replace_named_bind_variables'
activerecord (3.2.11) lib/active_record/sanitization.rb:135:in `gsub'
activerecord (3.2.11) lib/active_record/sanitization.rb:135:in `replace_named_bind_variables'
activerecord (3.2.11) lib/active_record/sanitization.rb:115:in `sanitize_sql_array'
activerecord (3.2.11) lib/active_record/sanitization.rb:28:in `sanitize_sql_for_conditions'
activerecord (3.2.11) lib/active_record/relation/query_methods.rb:324:in `build_where'
activerecord (3.2.11) lib/active_record/relation/query_methods.rb:136:in `where'
activerecord (3.2.11) lib/active_record/querying.rb:9:in `where'
巫术 (0.7.13) 库/巫术/模型/适配器/active_record.rb:32:in `find_by_credentials'
巫术 (0.7.13) lib/sorcery/model.rb:108:in 'authenticate'
巫术 (0.7.13) lib/sorcery/controller.rb:33:in `login'
app/controllers/sessions_controller.rb:8:in `create'
我想我太新了,不能马上回答我自己的问题。自己修好了:
在 sorcery.rb 中,我有:
user.username_attribute_names = '[:email]'
显然,引号不应该在那里。我对文件中的评论感到困惑。进行更改后,我需要重新启动服务器才能使更改生效。