0

回答。见文末。

我主要是一名 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]'

显然,引号不应该在那里。我对文件中的评论感到困惑。进行更改后,我需要重新启动服务器才能使更改生效。

4

2 回答 2

1

自己修好了:

在 sorcery.rb 中,我有:

user.username_attribute_names = '[:email]'

显然,引号不应该在那里。我对文件中的评论感到困惑。进行更改后,我需要重新启动服务器才能使更改生效。

于 2013-01-22T17:25:58.103 回答
0

我看到巫术的源代码。而 username_attribute_names 应该是一个数组。

这是在 sorcery/spec/rails3/spec/controller_spec.rb 中:

sorcery_model_property_set(:username_attribute_names, [:username, :email])

它将被调用:def find_by_credentials(credentials) sql = @sorcery_config.username_attribute_names.map{|attribute| column_name(attribute) + " = :login"} where(sql.join(' OR '), :login => credentials[0]).first end

所以,试试

user.username_attribute_names = [:email] 或 sorcery_model_property_set(:username_attribute_names, [:email])

于 2013-01-22T08:57:44.843 回答