回答。见帖子的结尾。
我主要是Java开发人员,对Ruby on Rails来说还是个新手。我已成功通过railstutorial.org上的教程。所以我让它工作一次。当我第二次开始阅读教程时,我的问题出现了,但这次尝试用Sorcery gem替换身份验证。我的主要参考是episode #283 on railscasts.org。其中一些工作正常,但当我尝试登录时,我收到一条错误消息:
SessionsController中的ActiveRecord :: PreparedStatementInvalid #create
缺少以下内容的值:[:email] =:login
中的电子邮件
这是一个很难搜索的东西,因为它非常具体,但很多地方出现了非常一般的词汇。当我使用它时,我认为我的工作方式与原始教程中的方式相同。下面是我的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>
这里是我的sessions_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并更改了要使用的param。
我真的迷失在这里。不知道为什么它不像教程一样工作。任何帮助将不胜感激。如果我应该提供任何其他信息,请告诉我。感谢。
编辑:
添加了上面的完整错误。巫术的登录方法或我的数据库一定是个问题。参数很好。这里是完整的堆栈跟踪(回到我的代码部分。它真的太长了。)
堆栈追踪:
activerecord(3.2.11)lib / active_record / sanitization.rb:141:在`block in replace_named_bind_variables&#39;
activerecord(3.2.11)lib / active_record / sanitization.rb:135:在`gsub&#39;
activerecord(3.2.11)lib / active_record / sanitization.rb:135:在`replace_named_bind_variables&#39;
activerecord(3.2.11)lib / active_record / sanitization.rb:115:在`sanitize_sql_array&#39;
activerecord(3.2.11)lib / active_record / sanitization.rb:28:在`sanitize_sql_for_conditions&#39;
activerecord(3.2.11)lib / active_record / relation / query_methods.rb:324:在`build_where&#39;
activerecord(3.2.11)lib / active_record / relation / query_methods.rb:136:在`where&#39;
activerecord(3.2.11)lib / active_record / querying.rb:9:,,,,,&#39;
巫术(0.7.13)lib / sorcery / model / adapters / active_record.rb:32:在`find_by_credentials&#39;
巫术(0.7.13)lib / sorcery / model.rb:108:在`authenticate&#39;
巫术(0.7.13)lib / sorcery / controller.rb:33:在`login&#39;
app / controllers / sessions_controller.rb:8:在'create&#39;
中
我想我现在太新了,无法立即回答我自己的问题。我自己修正了:
在sorcery.rb中,我有:
user.username_attribute_names =&#39; [:email]&#39;
显然,报价不应该存在。我对文件中的评论感到困惑。完成更改后,我需要重新启动服务器才能使更改生效。
答案 0 :(得分:1)
自己修正了:
在sorcery.rb中,我有:
user.username_attribute_names ='[:email]'
显然,引号不应该在那里。我对文件中的评论感到困惑。完成更改后,我需要重新启动服务器才能使更改生效。
答案 1 :(得分:0)
我看到了巫术的源代码。而username_attribute_names应该是一个数组。
这是在sorcery / spec / rails3 / spec / controller_spec.rb:
sorcery_model_property_set(:username_attribute_names,[:username,:email])
它将被称为: def find_by_credentials(凭证) sql = @ sorcery_config.username_attribute_names.map {| attribute | column_name(attribute)+“=:login”} where(sql.join('OR'),:login =&gt; credentials [0])。first 端
所以,试试
user.username_attribute_names = [:email] 或者sorcery_model_property_set(:username_attribute_names,[:email])