Rails控制器参数属性未定义

时间:2013-01-21 20:09:45

标签: ruby-on-rails ruby session railstutorial.org sorcery

回答。见帖子的结尾。

我主要是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;

显然,报价不应该存在。我对文件中的评论感到困惑。完成更改后,我需要重新启动服务器才能使更改生效。

2 个答案:

答案 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])